以下是关于 0.1 + 0.2 ≠ 0.3 的详细解释,结合二进制转换与浮点数精度问题:
核心原因:浮点数在计算机中以二进制存储,而十进制小数(如0.1、0.2)无法用有限位二进制精确表示,导致计算时产生舍入误差。
0.00011001100110011001100...
(无限循环,循环节为 1100
)。0.00011001100110011001101
(最后一位进位导致舍入误差)。0.0011001100110011001100...
(无限循环,循环节为 1100
)。0.00110011001100110011010
(同样存在舍入误差)。0.00011001100110011001101 (0.1的近似值)
0.300000011920928955078125
(单精度结果)。0.3000000000000000444089209850062616169452667236328125
)。|a - b| < 1e-9
)判断是否相等。decimal
模块、Java的 BigDecimal
等。数值 | 二进制表示(单精度近似) | 十进制近似值 |
---|---|---|
0.1 | 0.00011001100110011001101 |
0.10000000149011611938 |
0.2 | 0.00110011001100110011010 |
0.20000000298023223876 |
0.1+0.2 | 0.01001100110011001100111 |
0.30000001192092895508 |
计算机中浮点数的二进制存储机制导致无限循环小数无法精确表示,最终计算结果因舍入误差偏离预期。