0.1、0.2 和 0.3 都是浮点数。然而,它们的精确二进制表示是无穷的。当计算机尝试将这些无限精度的浮点数近似为有限的二进制表示时,舍入误差就会产生。
在IEEE 754标准中,浮点数采用二进制的科学计数法表示,即一个数的二进制表示为:(-1)^s × m × 2^e,其中 s 表示符号位,m 是有效数字,e 是指数。
0.1 的精确二进制表示是一个无限循环的数字:0.0001100110011001100110011001100110011001100110011…,由于浮点数只能存储有限位数的二进制数,因此最接近 0.1 的二进制表示为:0.00011001100110011001100。
同理,0.2 的精确二进制表示是一个无限循环的数字:0.00110011001100110011001100110011001100110011…,最接近 0.2 的二进制表示为:0.00110011001100110011010。
当计算机执行加法操作时,它会对这两个近似值进行相加,并产生一个结果。在这个例子中,0.00011001100110011001100 + 0.00110011001100110011010 的结果是 0.01001100110011001100110。
然后,计算机会对结果进行舍入,将其近似为可存储的浮点数。舍入规则取决于浮点数表示的位数和规范。
在这种情况下,0.01001100110011001100110 被舍入为最接近的可表示浮点数,即:0.01001100110011001100110011001101。
因此,当计算机执行 0.1+0.2 时,由于舍入误差的存在,最终结果变为 0.30000000000000004。