1. 程式人生 > >浮點數的那些坑,Java中的金額處理方案

浮點數的那些坑,Java中的金額處理方案

Java中的浮點數由於精度問題經常出現意料之外的結果,而我們又不得不和RMB打交道的

有任何問題,歡迎Email to: [email protected]

1.舉個栗子:

public static void main(String[] args) {
System.out.println(50.0+  479.08 );
System.out.println(5.0 - 4.9);
}

在JDK1.7.0_60版本中輸出結果是

529.0799999999999
0.09999999999999964

目前可行的解決方案有

1.如果是老系統,以前都是用的Double型別,可以用如下方法在每次運算完成之後格式化一下:

/**
     * 四捨五入
     * @param num
     * @param newScale 保留位數
     * @return
     */
    public static double roundHalfUp(Double num, int newScale){
        if(num == null){
            return 0;
        }
        BigDecimal bd = new BigDecimal(num);
        return bd.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

2.新系統建議用Long型別處理金額,精確度為分

3.銀行等金融專案BigDecimal

public static void main(String[] args) {
BigDecimal bd = new BigDecimal("50.0"); // 注意,引數是字串
BigDecimal bd2 = new BigDecimal("479.08");
System.out.println(bd.add(bd2));
System.out.println(50.0+  479.08 );
System.out.println(5.0 - 4.9);
}