我刚刚重读了Python 3.0的新特性,它说:
round()函数的舍入策略和返回类型已更改。
精确的中间情况现在四舍五入到最接近的偶数结果代替
远离0的。(例如,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被引入的时候,肯定有一些讨论
但在我的寻找中,我找不到一个好的理由。
有人知道为什么这个变成了这个吗?
有没有其他主流编程语言(例如,C, c++, Java, Perl, ..)做这种类型的舍入(对我来说不一致)?
我错过了什么?
更新:@Li-aungYip关于“银行家的舍入”的评论给了我正确的搜索词/关键字来搜索,我发现了这个SO问题:为什么。net使用银行家的舍入作为默认值?,所以我会仔细阅读。
Python 3的方法(称为“四舍五入”或“银行家四舍五入”)目前被认为是标准的四舍五入方法,尽管一些语言实现还没有在总线上实现。
简单的“总是四舍五入0.5”技术会导致对较大数字的轻微偏向。对于大量的计算,这是非常重要的。Python 3.0方法消除了这个问题。
常用的四舍五入方法不止一种。IEEE 754是浮点数学的国际标准,定义了五种不同的舍入方法(Python 3.0使用的是默认方法)。还有其他的。
这种行为并没有像它应有的那样广为人知。如果我没记错的话,AppleScript是这种舍入方法的早期采用者。AppleScript中的round命令提供了几个选项,但在IEEE 754中,round-向偶数是默认的。显然,实现round命令的工程师受够了“让它像我在学校学到的那样工作”的所有请求,所以他实现了:学校教的round 2.5舍入是一个有效的AppleScript命令。: -)
某些情况下:
in: Decimal(75.29 / 2).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
in: round(75.29 / 2, 2)
out: 37.65 GOOD
in: Decimal(85.55 / 2).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
in: round(85.55 / 2, 2)
out: 42.77 BAD
修复:
in: round(75.29 / 2 + 0.00001, 2)
out: 37.65 GOOD
in: round(85.55 / 2 + 0.00001, 2)
out: 42.78 GOOD
如果你想要更多的小数,例如4,你应该加上(+ 0.0000001)。
为我工作。