Java浮点数丢失精度小结

                                                返回主页

Exaple:

Double num1 = 1.0;
Double num2 = 0.8;
Double result2 = num1 - num2;
System.out.println(result2);

运行结果为

0.19999999999999996

解释

这并不是说java对浮点数的运算出错。

java遵守IEEE754浮点数运算规范,使用分数与指数来表示浮点数。

例如:0.5会使用1/2表示,0.75使用1/2 + 1/4表示,0.875使用1/2 + ¼ + 1/8表示;而0.1使用1/16 + 1/32 + 1/256 + 1/4096 + 1/8192 + …无限循环下去,转换成小数无法精确表示。

那么如何在java中提高运算的精确度呢?

答案是可以使用java.math.BigDecimal类。

同样的问题,使用BigDecimal类进行计算之后得到的结果更为精确。

Exaple:

    BigDecimal oprate1 = new BigDecimal("1.0");
    BigDecimal oprate2 = new BigDecimal("0.8");
    BigDecimal result = oprate1.subtract(oprate2);
    System.out.println(result);

运行结果:

0.2

PS

BigDecimal提供plus、substract、multiply、divide等方法用于进行加减乘除运算,这些方法都会返回运算结果的BigDecimal.