关于浮点数计算的精度问题。
我尝试运行了如下代码:
public class TestDouble {
public static void main(String args[]) {System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));System.out.println("4.015 * 100 = " + (4.015 * 100));System.out.println("123.3 / 100 = " + (1235.3 / 100));
}
}
根据尝试,输出的结果应该是对应的精确整数,但真正输出的结果与我设想的不同。如下:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 12.353
这些结果里,每个都有些许的误差, 多次尝试都是如此,也就是说,计算浮点数时,其结果是不精确的。
其原因我通过查阅资料了解到:计算浮点数时出现不精确结果的原因主要与浮点数的二进制表示有关。计算机使用二进制系统来存储和处理数字,但是并非所有的十进制小数都能被精确地转换为二进制小数。例如,十进制的0.1在二进制中是一个循环小数,无法用有限的二进制数位完全表示。因此,当这些二进制近似值被存储在计算机中时,它们会引入舍入误差。这些舍入误差在进行浮点数的算术运算时会累积,导致最终结果与预期的十进制结果不符。
这也就导致小于1的部分,也就是浮点数的小数部分输出时会有误差。