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.math.BigDecimal类。
同样的问题,使用BigDecimal类进行计算之后得到的结果更为精确。
BigDecimal oprate1 = new BigDecimal("1.0");
BigDecimal oprate2 = new BigDecimal("0.8");
BigDecimal result = oprate1.subtract(oprate2);
System.out.println(result);
0.2
BigDecimal提供plus、substract、multiply、divide等方法用于进行加减乘除运算,这些方法都会返回运算结果的BigDecimal.