Python中使用print语句进行浮点数相等比较的异常结果原因咨询
浮点数等值判断结果不一致的原因说明
核心成因:IEEE 754 双精度浮点数的存储局限
日常编码中用到的十进制小数,绝大多数都无法被二进制格式的浮点数完全精确表示。计算机存储这类数值时,只能保存与原值最接近的二进制近似值,不同十进制数对应的近似值的偏差方向、大小没有统一规律,最终就会出现观察到的“一组相加判断为真、另一组判断为假”的反差现象。
两组计算的具体原理拆解
print(0.3 + 0.1 == 0.4)返回True的逻辑
计算机实际存储的0.1、0.3两个近似值,相加之后得到的二进制结果,和单独存储的0.4对应的二进制近似值完全重合,因此等值判断成立。如果打印20位精度的小数做验证,可以发现0.1+0.3和0.4的逐位输出完全一致,不存在可被检测到的偏差。print(0.2 + 0.1 == 0.3)返回False的逻辑
计算机实际存储的0.2、0.1两个近似值相加后,结果并不是精确的0.3,而是带微小偏差的0.30000000000000004;而单独存储的0.3本身也是近似值,实际数值为0.29999999999999998889...,两个值存在微小但明确的差值,因此等值判断返回False。
补充说明:这个现象不是Python独有的问题,所有遵循IEEE 754浮点数存储标准的编程语言,运行相同的计算逻辑都会得到完全一致的判断结果。
浮点数相等判断的正确处理方式
直接用==运算符做浮点数相等判断,很容易因为存储精度偏差踩坑,实际开发中可以参考两种通用方案:
- 预留可接受的误差范围,判断两个数的差值绝对值是否小于预设的极小值(通常称为epsilon,一般取
1e-9),例如判断两个数近似相等的写法:abs(a - b) < 1e-9 - 对精度要求高的场景(比如财务类计算),可以直接引入Python内置的
decimal模块,使用十进制高精度类型完成计算,从根源上规避二进制浮点数的存储偏差问题。
内容的提问来源于stack exchange,提问作者Srikrishna Sharma
相关产品推荐
相关产品推荐

