为何1.0/100.0 == 0.1/10.0返回True?与0.1+0.2≠0.3矛盾?
为什么1.0/100.0与0.1/10.0的浮点数比较结果为True?
Python和C里的double类型都遵循IEEE 754双精度浮点数标准,这类浮点数的相等比较是严格匹配二进制位,而非判断数学上的绝对相等。这就是你疑惑的核心原因所在。
两个计算最终得到了同一个二进制浮点数
数学上1.0/100.0和0.1/10.0都是0.01,但关键是:这两个计算过程的结果,在IEEE 754的舍入规则下,最终被编码成了完全相同的二进制位。
1.0和100.0都是能被精确表示的浮点数,它们相除后得到的数学值0.01无法用二进制精确表示,但会被舍入到最接近的双精度值。0.1本身是双精度的近似值,但将它除以精确表示的10.0后,得到的结果恰好和1.0/100.0的舍入结果完全一致。
和0.1+0.2≠0.3的本质差异
0.1和0.2的双精度近似值相加后,得到的结果与0.3的双精度近似值二进制位不匹配:
- 0.1的双精度二进制编码是
0x3FB999999999999A - 0.2的双精度编码是
0x3FC999999999999A - 二者相加的结果编码是
0x3FD3333333333333 - 而0.3的双精度编码是
0x3FD3333333333334
仅仅一位二进制位的差异,就导致比较结果为False。
你存在的认知遗漏
你可能默认所有涉及非精确浮点数的计算都会产生不同的近似值,但实际上:
- 不同计算路径只要最终收敛到同一个IEEE 754舍入结果,就会被判定为相等。
- 浮点数的相等比较只看二进制位是否完全一致,和数学上的精确值是否相等没有必然关联——只有当两个计算的数学结果相同,且舍入后得到同一个二进制表示时,才会返回True。
内容的提问来源于stack exchange,提问作者PkDrew
相关产品推荐
相关产品推荐

