为何Python中5.5%1.1返回1.0999999999999996而非0.0?
Python中5.5%1.1返回非0值的原因
核心问题出在浮点数的二进制精度限制:
- 计算机中的
float类型(Python采用64位双精度浮点数)通过二进制存储数值,但并非所有十进制小数都能被二进制精确表示。比如1.1这个数,转换成二进制后是无限循环的小数,类似十进制里的1/3=0.333...,所以存储时只能取近似值,这个值比真实的1.1略大一点。 - 5.5虽能被二进制精确表示(5.5=11/2,属于2的负整数次幂的倍数),但受1.1近似存储值的影响,取余运算出现了偏差。
取余运算的逻辑是 a % b = a - (b * floor(a/b)),由于1.1的近似值略大,floor(5.5 / 近似1.1)得到的结果是4而非预期的5,最终计算出的余数就是5.5 - (近似1.1 *4),也就是你看到的1.0999999999999996。
而55%11和55.0%11.0能得到精确0的原因是:一定范围内的整数都可以被二进制精确存储,55和11的浮点表示完全精准,因此运算结果准确。
如果需要精确的十进制运算,可以使用Python的decimal模块:
from decimal import Decimal print(Decimal('5.5') % Decimal('1.1')) # 输出 0
内容的提问来源于stack exchange,提问作者plpm
相关产品推荐
相关产品推荐

