Python中末尾为.225的不同数字为何舍入结果不同?
为什么Python中.225的舍入结果不一致?
先看你给出的代码运行结果:
>>> print('result:%9.2f' % 1111.225) result: 1111.22 >>> print('result:%9.2f' % 11111.225) result: 11111.23 >>> print('result:%9.2f' % 111.225) result: 111.22 >>> print('result:%9.2f' % 11.225) result: 11.22 >>> print('result:%9.2f' % 1.225) result: 1.23
问题本质:浮点数的二进制精度限制
这种舍入差异的核心原因是十进制的0.225无法被二进制浮点数精确存储。Python里的float类型遵循IEEE 754标准,用二进制格式存储小数,但部分十进制小数转换成二进制后是无限循环的,只能以近似值存储。
举个直观的例子,用repr()函数查看这些数的真实存储值:
>>> repr(11.225) '11.224999999999999' >>> repr(1.225) '1.2250000000000001'
可以看到:
11.225实际存储的是略小于11.225的近似值,保留两位小数时自然向下舍入到11.221.225实际存储的是略大于1.225的近似值,所以向上舍入到1.23
其他数字的差异也是同理,取决于它们加上0.225后的实际存储值是略高还是略低于两位小数的分界点。
解决办法:用decimal模块实现精确舍入
如果需要严格按照十进制规则进行四舍五入,可以使用Python标准库的decimal模块,它支持高精度的十进制运算:
from decimal import Decimal, ROUND_HALF_UP nums = ['1111.225', '11111.225', '111.225', '11.225', '1.225'] for num in nums: d = Decimal(num) rounded = d.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP) print(f'result: {rounded:>7}')
运行后会得到统一的预期结果:
result: 1111.23 result: 11111.23 result: 111.23 result: 11.23 result: 1.23
内容的提问来源于stack exchange,提问作者张玉科
相关产品推荐
相关产品推荐

