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

Python中数字取整结果异常?是否为计算错误或认知疏漏

这不是计算错误,是浮点数存储的认知遗漏!

你遇到的这个情况,是Python(以及绝大多数现代编程语言)处理浮点数时的经典“精度陷阱”——完全不是计算错误,而是你对二进制浮点数的存储本质不了解导致的认知偏差。

核心原因:十进制小数无法精确转二进制

计算机底层用二进制存储浮点数,但很多十进制小数(比如0.005、90.005)在二进制中是无限循环的小数,只能存储它们的近似值。这就导致你写的0.005、90.005这些字面量,实际在内存里的数值和你看到的十进制数有细微差异。

针对你的例子具体拆解

我们可以用repr()函数查看这些浮点数的真实存储值(它会输出最接近实际存储的十进制表示):

print(repr(0.005))
print(repr(90.005))
print(repr(90.015))

运行结果大概是:

0.005000000000000000104083408558608425664715468883514404296875
90.0049999999999971578290569595992565155029296875
90.015000000000005684341886080801486968994140625
  • 0.005实际存储的是略大于0.005的数值,所以%.2f四舍五入后得到0.01
  • 90.005实际存储的是略小于90.005的数值,所以四舍五入后得到90.00
  • 90.015实际存储的是略大于90.015的数值,所以四舍五入后得到90.02

如何实现“符合直觉”的四舍五入?

如果需要精确的十进制四舍五入(比如金融、统计场景),推荐使用Python的decimal模块——它基于十进制运算,完全避免二进制浮点数的精度问题:

from decimal import Decimal, ROUND_HALF_UP

# 注意要用字符串传入数值,避免浮点数本身的精度损失
a = Decimal('0.005')
b = Decimal('90.005')
c = Decimal('90.015')

print(a.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 输出: 0.01
print(b.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 输出: 90.01
print(c.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 输出: 90.02

这样就能得到符合我们日常认知的四舍五入结果了。

内容的提问来源于stack exchange,提问作者Shivendra Saxena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:34