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

Python中round函数舍入异常:为何round(51.665,2)与round(51.765,2)结果不同?

为什么Python的round函数会出现看似矛盾的结果?

嘿,这个问题其实戳中了Python(以及很多编程语言)里浮点数表示的一个核心痛点——二进制浮点数的精度限制,咱们一步步拆解来看:

核心原因:浮点数的二进制存储不精确

咱们日常用的十进制小数,有很多没法转换成精确的二进制小数,就像1/3没法用有限的十进制数字表示一样。比如你提到的51.665和51.765,看起来是规整的三位十进制数,但它们转换成二进制后是无限循环的,所以Python用浮点数存储时,只能保存一个最接近的近似值。

  • 对于51.665,实际存储的近似值是略小于它本身的:用format(51.665, '.20f')可以看到,它的真实存储值是51.66499999999999886313。当你调用round(51.665, 2)时,函数会基于这个实际存储的近似值来四舍五入,自然就得到了51.66。
  • 而51.765的情况刚好相反,它的实际存储近似值是51.76500000000000227374,略大于原数,所以四舍五入到两位小数就得到了51.77。

如何得到符合直觉的四舍五入?

如果需要精确的十进制四舍五入(也就是我们通常理解的“四舍五入”规则),可以使用Python标准库中的decimal模块,它是基于十进制运算的,能精确表示十进制小数:

from decimal import Decimal, ROUND_HALF_UP

# 注意要用字符串初始化,避免浮点数精度问题
num1 = Decimal('51.665')
num2 = Decimal('51.765')

print(num1.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 输出 51.67
print(num2.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 输出 51.77

这样就能得到符合我们直觉的结果啦。

内容的提问来源于stack exchange,提问作者Shubhankar Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:09