Python中1023456789876543201除以9两种运算结果不一致疑问
问题原因解析
这个现象本质还是双精度浮点数的精度限制,你认为不属于典型浮点数问题属于认知误区,只是这次精度丢失发生在大整数区间,而非大家熟悉的小数区间。
核心原理
Python 中使用/做除法默认返回 IEEE 754 标准的64位双精度浮点数,这种浮点数的存储结构决定了它只有53个二进制位用来存储有效数字,换算成十进制大概是15~17位有效数字,所有超过这个长度的整数都无法被精确存储,会自动取最近的可表示的浮点数近似值。
- 双精度浮点数可精确存储的最大整数为
2^53 = 9007199254740992,共16位十进制长度 - 你计算得到的正确商
113717421097393689是18位十进制数,已经远远超出了精确表示的上限
误差产生过程
- 首先被除数
1023456789876543201本身就是19位十进制数,转成浮点数时已经丢失了低位精度 - 除法计算得到的商同样超过双精度精确存储上限,系统会自动匹配最接近的可表示双精度值:
113717421097393696,就是你代码一输出的结果 - 而
//是整数除法,全程用Python支持任意精度的整数类型计算,不会有精度丢失,所以输出的是正确结果
你可以用以下代码验证这个逻辑:
print(int(float(113717421097393689))) # 输出结果为 113717421097393696,和你代码一的结果完全一致
内容的提问来源于stack exchange,提问作者Natalia S. Efimtseva
相关产品推荐
相关产品推荐

