java 金錢計算 BigDecimal

浮點數採用的是二進制的標識方式,不能準確的表達十進制的運算,兩個doule、float進行運算的時候,會出現精確度的偏差

在java中,涉及到金錢的計算建議採用 java.math.BigDecimal


提供一個工具類,包含加減乘除的操作

import java.math.BigDecimal;

public  class Arith {
    /**
     * 提供精確加法計算的add方法
     * @param value1 被加數
     * @param value2 加數
     * @return 兩個參數的和
     */
    public static double add(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }
    
    /**
     * 提供精確減法運算的sub方法
     * @param value1 被減數
     * @param value2 減數
     * @return 兩個參數的差
     */
    public static double sub(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }
    
    /**
     * 提供精確乘法運算的mul方法
     * @param value1 被乘數
     * @param value2 乘數
     * @return 兩個參數的積
     */
    public static double mul(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }
    
    /**
     * 提供精確的除法運算方法div
     * @param value1 被除數
     * @param value2 除數
     * @param scale 精確範圍
     * @return 兩個參數的商
     * @throws IllegalAccessException
     */
    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
        //如果精確範圍小於0,拋出異常信息
        if(scale<0){         
            throw new IllegalAccessException("精確度不能小於0");
        }
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.divide(b2, scale).doubleValue();    
    }
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章