Java基础之解决小数计算不精确问题

前言

面试题

问:请你解释为什么会出现4.0-3.6=0.40000001这种现象?
答:这里十进制的计算会转化为二进制的计算,而二进制有的时候无法精确地表示十进制的小数,因为有些小数无法写成1/(2^n)的和的形式(比如0.1),如此就会出现误差,那么最后计算得出的结果自然也会有误差。

1. 如何解决

用BigDecimal,这里注意:构造方法里面的参数只有是字符串形式时才不会丢失精度。
比如:

		//BigDecimal简单练习
        double value1=4.0;
        double value2=3.6;
        System.out.println(value1-value2);//丢失精度

        BigDecimal decimal1=new BigDecimal(value1);
        BigDecimal decimal2=new BigDecimal(value2);
        System.out.println(decimal1.subtract(decimal2));//还是丢失精度

        BigDecimal decimal5=new BigDecimal(String.valueOf(value1));
        BigDecimal decimal6=new BigDecimal(String.valueOf(value2));
        System.out.println(decimal5.subtract(decimal6));//正确结果(所以推荐用这个)

        BigDecimal decimal3=new BigDecimal(Double.toString(value1));
        BigDecimal decimal4=new BigDecimal(Double.toString(value2));
        System.out.println(decimal3.subtract(decimal4));//正确结果(所以推荐用这个)

结果:

0.3999999999999999
0.399999999999999911182158029987476766109466552734375
0.4
0.4

参考链接:https://zhuanlan.zhihu.com/p/164568001


版权声明:本文为weixin_43851264原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。