Python 3.x舍入行为


176

我只是在重新阅读Python 3.0的新增功能,它指出:

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

以及关于round的文档:

对于支持round()的内置类型,将值四舍五入为乘幂n的最接近10的倍数;如果两个倍数相等接近,则四舍五入取整为偶数选择

因此,在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的评论有关“银行取整”为我提供了正确的搜索词/关键字进行搜索,我发现了这样一个问题:为什么.NET默认使用银行取整?,所以我会仔细阅读。


27
我没有时间查一下,但我相信这被称为“银行家四舍五入”。我相信这在金融行业很普遍。
叶李昂

2
@sberry好,是的,它的行为与它自己的描述一致。所以,如果它会说:“四舍五入”是增加了一倍的价值和做的,它也将是一致的:) ..但似乎相反的是常用的四舍五入方法。所以我正在寻找更好的理解。
莱文

1
@ Li-aungYip感谢您对“银行家四舍五入”的领导。
莱文


3
请注意:银行四舍五入不仅在金融领域很普遍。这就是我70年代就已经开始在小学四舍五入的方法:-)
Lennart Regebro 2013年

Answers:


159

如今,Python 3.0的方法被认为是标准的舍入方法,尽管某些语言实现尚未上市。

简单的“总是向上取整0.5”技术会导致对较高数字的轻微偏向。通过大量计算,这可能很重要。Python 3.0方法消除了这个问题。

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

这种行为并未得到应有的广泛了解。如果我没记错的话,AppleScript是这种舍入方法的早期采用者。roundAppleScript中的命令实际上确实提供了几个选项,但是IEEE 754中的默认设置是roundtoward-even round。他实现的“学校”:round 2.5 rounding as taught in school是有效的AppleScript命令。:-)


4
我现在还不太了解这种“默认的标准舍入方法”,您(或其他任何人)是否知道C / C ++ / Java / Perl或任何其他“主流”语言是否以相同的方式实现舍入?
莱文

3
Ruby做到了。Microsoft的.NET语言可以做到这一点。但是,Java似乎没有。我无法针对每种可能的语言进行追踪,但是我猜它在最近设计的语言中最常见。我认为C和C ++足够老,以至于没有。
kindall

5
红宝石回报32.5.round
JFS

14
我添加了一些有关AppleScript对此的处理方式,因为我喜欢实现“旧”行为的讽刺方式。
kindall

2
@kindall自1985年(发布IEEE 754-1985以来),此方法一直是IEEE默认的舍入模式。自从至少C89(因此也是C ++)以来,它也一直是C中的默认舍入模式,但是,由于C99(以及之前具有零星支持的C ++ 11),已经可以使用“ round()”函数了关系从零舍入。内部浮点舍入和rint()系列函数仍遵循舍入模式设置,默认情况下将舍入为偶数。
Wlerin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.