Java中的浮点数由于精度问题经常出现意料之外的结果,而我们又不得不和RMB打交道的
有任何问题,欢迎Email to: bob@bob4j.com
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);
}