浮點數的那些坑,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);
}

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