Python浮点数取模(Modulo)返回非预期余数问题求解
问题原因解答
核心本质:浮点数的二进制存储精度限制
- 所有十进制小数在计算机底层都会转换为二进制存储,绝大多数十进制有限小数都无法转换为有限长度的二进制数,只能做精度截断后存储为近似值。你在代码中写的
9.2,实际存储到内存中时并不是数学意义上严格等于9.2的数值,而是一个和9.2极其接近的近似值。
两种运算结果差异的原因
9.2 / 4的结果是2.3,本身同样是近似值,只是这个近似值刚好匹配Python默认的浮点数打印规则,会被简化显示为2.3,看起来和预期一致。- 取余运算的底层逻辑是:
a % b = a - (b * int(a // b)),代入数值计算时,近似存储的9.2减去4*2=8后,得到的差就不是精确的1.2,而是你看到的1.1999999999999993。
解决方案
如果需要精确的十进制小数运算,可以使用Python标准库的decimal模块实现:
from decimal import Decimal # 注意构造Decimal时要传入字符串,不能直接传浮点数 res = Decimal('9.2') % Decimal('4') print(res) # 输出为1.2,符合预期
内容的提问来源于stack exchange,提问作者Akshat Gupta
相关产品推荐
相关产品推荐

