java解决数据精度问题

 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

猜你喜欢

转载自blog.csdn.net/qq_39404258/article/details/82258380