前言
面试题
问:请你解释为什么会出现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
版权声明:本文为weixin_43851264原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。