【问题标题】:Python rounding function returns different answer [duplicate]Python舍入函数返回不同的答案[重复]
【发布时间】:2019-11-04 21:15:01
【问题描述】:

如果我做 round(4.265,2),它会返回 4.26,但如果我做 round(4.375,2),它会返回 4.38。

round(4.265,2)
round(4.375,2)
Answer:
4.26 (Expecting 4.27 instead of 4.26)
4.38

我期望第一轮函数的输出为 4.27,就像它为第二轮函数 (4.38) 所做的那样。有谁知道为什么 python 返回不同的四舍五入答案?

【问题讨论】:

  • 在此处找到相关答案:stackoverflow.com/questions/10093783/… 它被称为“银行家的四舍五入”。
  • 银行家的四舍五入并不是解释这种行为的原因。结果是由于将用十进制表示的数字文字转换为正在使用的内部二进制浮点格式时引入的错误。 4.265 舍入到 4.26,因为它更接近 4.26 而不是 4.27。
  • 感谢@ShadowRanger。我一直在寻找那个重复但没有找到它(并找到了很多试图通过银行家四舍五入来解释这一点的答案)。
  • @MarkDickinson:我很确定还有其他重复项,这只是我发现的第一个。我同意很难一目了然地确定一个问题是涉及银行家的四舍五入还是浮点表示问题。

标签: python python-3.x floating-point rounding


【解决方案1】:

Python 使用 Round to Nearest, Ties to Even 舍入方法。 https://en.wikipedia.org/wiki/IEEE_754-1985#Rounding_floating-point_numbers

【讨论】:

  • 请注意,“与偶数的关系”位在这里并不那么相关:4.265 舍入到 4.26 纯粹是因为它 更接近4.26 而不是4.27,感谢二进制浮点通常所见即所得的性质。数字文字4.265 给出了一个浮点数,其实际值为4.26499999999999968025576890795491635799407958984375,因此它实际上不是平局。 4.375 平局,因为4.375 恰好可以用二进制浮点数精确表示,所以平局部分确实 发挥作用。再举一个例子,考虑round(2.675, 2)(给出2.67)。
  • @MarkDickinson 谢谢,我更新了。事实上,Python 并没有在 round() 中使用 'tie to even' 舍入。
  • round 从 Python 3.0 开始使用 tie-to-even。你说得对,Python 2.7 使用 tie-away-from-zero。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2015-02-22
  • 2019-12-29
相关资源
最近更新 更多