浮点数的那些坑,Java中的金额处理方案 有更新!

  Bob

Java中的浮点数由于精度问题经常出现意料之外的结果,而我们又不得不和RMB打交道的

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


如有疑问或同行交流欢迎加群讨论:铂金信息技术交流群 151258054