Python中//地板除法与/浮点数除法运算结果差异问题求解
Python中
10000 // 0.1与10000 / 0.1结果差异的原因 这个差异本质是两个运算符的底层处理逻辑不同,叠加浮点数精度限制共同导致的:
1. 浮点数存储的前置前提
十进制的0.1无法用二进制浮点数精确表示,Python默认的双精度float类型存储的0.1实际值约为0.10000000000000000555,略大于数学意义上的0.1。
用这个实际存储值计算10000除以0.1,真实的数学商约为99999.99999999999444,略小于100000。
2. 两个运算符的核心处理差异
/是真除法:遵循IEEE 754浮点数运算标准,计算后会对结果做就近舍入(偶数舍入)。上面的商99999.99999999999444和100000.0的差值小于双精度浮点数的最小可分辨精度(ULP),所以会被舍入为100000.0,也就是你看到的输出结果。//是地板除法:运算逻辑是直接对真实的商做向下取整,不会做浮点数舍入操作。注意//的执行逻辑并不是“先调用/得到结果再取整”,而是会保留除法运算的中间精度后直接做向下取整,所以不会用到/运算舍入后的100000.0这个结果。商99999.99999999999444向下取整的结果就是99999.0,和/的结果自然不同。
补充验证
你可以用高精度十进制计算模块decimal验证这个逻辑:
from decimal import Decimal, getcontext getcontext().prec = 30 # 查看0.1的实际存储值 print(Decimal(0.1)) # 高精度计算10000 / 0.1的结果,确实小于100000 print(Decimal(10000) / Decimal(0.1))
内容的提问来源于stack exchange,提问作者Alexander Belyakov
相关产品推荐
相关产品推荐

