
在浮点运算中,1.0/100.0 == 0.1/10.0 返回 True 并非因为结果绝对精确,而是两个表达式恰好产生了相同的二进制浮点近似值——这是一种数值巧合,而非数学必然。
在浮点运算中,`1.0/100.0 == 0.1/10.0` 返回 `true` 并非因为结果绝对精确,而是两个表达式恰好产生了相同的二进制浮点近似值——这是一种数值巧合,而非数学必然。
浮点数在计算机中以 IEEE 754 双精度格式(64 位)表示,无法精确表达大多数十进制小数(如 0.1、0.2)。因此,浮点计算本质上是有误差的近似运算。但关键在于:误差传播路径不同,最终舍入结果却可能一致。
以 1.0 / 100.0 和 0.1 / 10.0 为例:
-
1.0 / 100.0:100.0是精确可表示的整数,除法直接对两个精确值运算,结果经舍入后得到某个特定的double值; -
0.1 / 10.0:0.1本身已是近似值(实际存储为0.1000000000000000055511151231257827021181583404541015625),再除以精确的10.0,其舍入结果恰好与前者相同。
这并非设计使然,而是 IEEE 754 舍入规则(默认为“就近舍入到偶数”)和具体数值组合下的偶然一致。如下反例清晰揭示其脆弱性:
>>> 0.0001 / 100 1e-06 >>> 0.00001 / 10 1.0000000000000002e-06 # 不等!差值约 2e-22 >>> 6.0 / 100 0.06 >>> 0.6 / 10 0.06 # 看似“幸运” >>> 7.0 / 100 0.07 >>> 0.7 / 10 0.06999999999999999 # 明显不等!差值约 1.1e-17
⚠️ 重要提醒:
- 永远不要用
==判断浮点数逻辑相等; - 应使用相对容差比较(如
math.isclose(a, b, rel_tol=1e-9)); - 理解“浮点数相等”本质是“两近似值在舍入后落入同一比特模式”,而非数学相等。
简言之:1.0/100.0 == 0.1/10.0 为 True,是浮点舍入的幸运碰撞;而 0.1 + 0.2 != 0.3 才是浮点运算的常态。二者并不矛盾——它们共同印证了浮点数的近似本质。

















