處理浮點數的工具類

package demo.springboot.web;/** * Created with IntelliJ IDEA. * User: gaopeng * Date: 2018/8/9 0009 * Time: 17:13 * Description: */import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.ParseException;public class DecimalCalculate{    /**     * 因爲Java的簡單類型不可以精確的對浮點數進行運算,這個工具類提供精     * 確的浮點數運算,包括加減乘除和四捨五入。     *///默認除法運算精度    private static final int DEF_DIV_SCALE = 10;    private static Log logger = LogFactory.getLog(DecimalCalculate.class);    //這個類不能實例化    private DecimalCalculate(){    }    /**     * 提供精確的加法運算。     * @param v1 被加數     * @param v2 加數     * @return 兩個參數的和     */    public static double add(double v1,double v2){        BigDecimal b1 = new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.add(b2).doubleValue();    }    /**     * 提供精確的減法運算。     * @param v1 被減數     * @param v2 減數     * @return 兩個參數的差     */    public static double sub(double v1,double v2){        BigDecimal b1 = new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.subtract(b2).doubleValue();    }    /**     * 提供精確的乘法運算。     * @param v1 被乘數     * @param v2 乘數     * @return 兩個參數的積     */    public static double mul(double v1,double v2){        BigDecimal b1 = new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.multiply(b2).doubleValue();    }    /**     * 提供(相對)精確的除法運算,當發生除不盡的狀況時,精確到     * 小數點之後10位,之後的數字四捨五入。     * @param v1 被除數     * @param v2 除數     * @return 兩個參數的商     */    public static double div(double v1,double v2){        return div(v1,v2,DEF_DIV_SCALE);    }    /**     * 提供(相對)精確的除法運算。當發生除不盡的狀況時,由scale參數指     * 定精度,之後的數字四捨五入。     * @param v1 被除數     * @param v2 除數     * @param scale 表示表示須要精確到小數點之後幾位。     * @return 兩個參數的商     */    public static double div(double v1,double v2,int scale){        if(scale<0){            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b1 = new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();    }    /**     * 提供精確的小數位四捨五入處理。     * @param v 須要四捨五入的數字     * @param scale 小數點後保留幾位     * @return 四捨五入後的結果     */    public static double round(double v,int scale){        if(scale<0){            throw new IllegalArgumentException(                    "The scale must be a positive integer or zero");        }        BigDecimal b = new BigDecimal(Double.toString(v));        BigDecimal one = new BigDecimal("1");        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();    }    /**     * 提供精確的類型轉換(Float)     * @param v 須要被轉換的數字     * @return 返回轉換結果     */    public static float convertsToFloat(double v){        BigDecimal b = new BigDecimal(v);        return b.floatValue();    }    /**     * 提供精確的類型轉換(Int)不進行四捨五入     * @param v 須要被轉換的數字     * @return 返回轉換結果     */    public static int convertsToInt(double v){        BigDecimal b = new BigDecimal(v);        return b.intValue();    }    /**     * 提供精確的類型轉換(Long)     * @param v 須要被轉換的數字     * @return 返回轉換結果     */    public static long convertsToLong(double v){        BigDecimal b = new BigDecimal(v);        return b.longValue();    }    /**     * 返回兩個數中大的一個值     * @param v1 須要被對比的第一個數     * @param v2 須要被對比的第二個數     * @return 返回兩個數中大的一個值     */    public static double returnMax(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.max(b2).doubleValue();    }    /**     * 返回兩個數中小的一個值     * @param v1 須要被對比的第一個數     * @param v2 須要被對比的第二個數     * @return 返回兩個數中小的一個值     */    public static double returnMin(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.min(b2).doubleValue();    }    /**     * 精確對比兩個數字     * @param v1 須要被對比的第一個數     * @param v2 須要被對比的第二個數     * @return 若是兩個數同樣則返回0,若是第一個數比第二個數大則返回1,反之返回-1     */    public static int compareTo(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.compareTo(b2);    }    /**     * 初始金額格式     */    public static String MONEY_PATTERN = "#,##0.00#";    /**     * 初始數字格式     */    public static String FLOAT_PATTERN = "#0.0########################";    /**     * 格式化金額(千分位)     * @param numStr     * @return     * @author mshi     */    public static final double parseMoney(String numStr) {        return parse(numStr, MONEY_PATTERN);    }    /**     * 格式化數字     * @param numStr     * @return     * @author mshi     */    public static final double parseNumber(String numStr) {        return parse(numStr, FLOAT_PATTERN);    }    /**     * 格式化     * @param numStr     * @param pattern 格式     * @return     * @author mshi     */    public static final double parse(String numStr, String pattern) {        double decimal = 0;        try {            DecimalFormat decFmt = new DecimalFormat(pattern);            decimal = decFmt.parse(numStr).doubleValue();        } catch (ParseException e) {            logger.error("parse(String) parse error", e);        }        return decimal;    }    /**     * 格式化金額(千分位)     * @param     * @return     * @author mshi     */    public static final String formatMoney(double decimal) {        return format(decimal, MONEY_PATTERN);    }    /**     * 格式化數字     * @param     * @return     * @author mshi     */    public static final String formatNumber(double decimal) {        return format(decimal, FLOAT_PATTERN);    }    /**     * 格式化金額     * @param     * @param pattern 格式     * @return     * @author mshi     */    public static final String format(double decimal, String pattern) {        DecimalFormat decFmt = new DecimalFormat(pattern);        return decFmt.format(decimal);    }}參考地址:https://blog.csdn.net/dingqinghu/article/details/46608863      https://blog.csdn.net/ccecwg/article/details/41822367
相關文章
相關標籤/搜索