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);
}