Python 3.x 舍入行为

新手上路,请多包涵

我刚刚重新阅读 What’s New In Python 3.0 并且它指出:

round() 函数舍入策略和返回类型已更改。精确的中途案例现在四舍五入到最接近的偶数结果,而不是远离零。 (例如,round(2.5) 现在返回 2 而不是 3。)

round 的文档:

对于支持 round() 的内置类型,值被四舍五入到最接近的 10 的乘方减去 n 的倍数;如果两个倍数同样接近,则向偶数选择四舍五入

所以,在 v2.7.3 下:

 In [85]: round(2.5)
Out[85]: 3.0

In [86]: round(3.5)
Out[86]: 4.0

正如我所料。但是,现在在 v3.2.3 下:

 In [32]: round(2.5)
Out[32]: 2

In [33]: round(3.5)
Out[33]: 4

这似乎违反直觉并且与我对四舍五入的理解相反(并且必然会绊倒人)。英语不是我的母语,但在我读到这篇文章之前,我想我知道四舍五入是什么意思:-/我确信在引入 v3 时一定有一些关于这个的讨论,但我无法找到一个很好的理由我的搜索。

  1. 有谁知道为什么将其更改为此?
  2. 是否有任何其他主流编程语言(例如, _C、C++、Java、Perl 等_)执行这种(对我而言不一致的)舍入?

我在这里错过了什么?

更新:@Li-aungYip 对“Banker’s rounding”的评论为我提供了正确的搜索词/关键字进行搜索,我发现了这个问题: Why does .NET use banker’s rounding as default? ,所以我会仔细阅读。

原文由 Levon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 540
2 个回答

Python 3 的方式(称为“ 四舍五入”或“银行家四舍五入”)如今被认为是标准的四舍五入方法,尽管一些语言实现尚未上线。

简单的“ 始终将 0.5 向上舍 入”技术会导致稍微偏向更高的数字。对于大量计算,这可能很重要。 Python 3.0 方法消除了这个问题。

常用的舍入方法不止一种。 IEEE 754 是浮点数学的国际标准,它定义了 五种不同的舍入方法(Python 3.0 使用的是默认方法)。 还有其他人

这种行为并没有像它应该的那样广为人知。如果我没记错的话,AppleScript 是这种舍入方法的早期采用者。 AppleScript 中的 round 命令 提供了几个选项,但 IEEE 754 中的默认设置是向偶数舍入。显然,实施 round 命令的工程师已经受够了他实现的所有“让它像我在学校学到的那样工作”的请求: round 2.5 rounding as taught in school 是一个有效的 AppleScript 命令。 :-)

原文由 kindall 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 Decimal 模块 控制在 Py3000 中获得的舍入:

 >>> decimal.Decimal('3.5').quantize(decimal.Decimal('1'),
    rounding=decimal.ROUND_HALF_UP)
>>> Decimal('4')

>>> decimal.Decimal('2.5').quantize(decimal.Decimal('1'),
    rounding=decimal.ROUND_HALF_EVEN)
>>> Decimal('2')

>>> decimal.Decimal('3.5').quantize(decimal.Decimal('1'),
    rounding=decimal.ROUND_HALF_DOWN)
>>> Decimal('3')

原文由 dawg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题