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
相关产品推荐
相关产品推荐

