System.out.println(12.0f-11.9f);
输出结果为:0.10000038
为什么会出现这种情况呢?
那是因为在将十进制浮点数转换为二进制浮点数时,小数的二进制有时也是不可能精确的,就如同十进制不能准确表示1/3,二进制也无法准确表示1/10,而double类型存储尾数部分最多只能存储52位,于是,计算机在存储该浮点型数据时,便出现了精度丢失(1)。例如,11.9的内存存储大约为:1011. 1110011001100110011001100...
而在进行浮点类数据计算的时候,浮点参与计算,会左移或右移n位,直到小数点移动到第一个有效数字的右边。于是11.9在转化为二进制后 小数点左移3位,就得到1. 011 11100110011001100110(精度丢失2)
于是最终浮点型运算出现了精度丢失误差。
解决方法:1.使用维护精度的二进制编码的十进制(BCD)库
2.用String来构造BigDecimal。(BigDecimal是java.math.BigDecimal类)
具体实现:
BigDecimal a=new BigDecimal(Float.toString(12.0f));
BigDecimal b=new BigDecimal(Float.toString(11.9f));
System.out.println(a.subtract(b).toString()); //返回值为String
System.out.println(12.0f-11.9f); //返回值是float
结果为:0.1
0.10000038