You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.22
  • 1.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,提问作者张玉科

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:10:21