我刚刚重读了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使用银行家的舍入作为默认值?,所以我会仔细阅读。
只是在这里添加一个文档中的重要说明:
https://docs.python.org/dev/library/functions.html#round
请注意
round()对于浮点数的行为可能令人惊讶:例如,
轮(2.675,2)给出2.67而不是预期的2.68。这不是
错误:这是一个事实的结果,大多数十进制分数不能
精确地表示为浮点数。参见浮点运算:问题
和限制以获取更多信息。
因此,在Python 3.2中得到以下结果时,不要感到惊讶:
>>> round(0.25,1), round(0.35,1), round(0.45,1), round(0.55,1)
(0.2, 0.3, 0.5, 0.6)
>>> round(0.025,2), round(0.035,2), round(0.045,2), round(0.055,2)
(0.03, 0.04, 0.04, 0.06)
Python 3的方法(称为“四舍五入”或“银行家四舍五入”)目前被认为是标准的四舍五入方法,尽管一些语言实现还没有在总线上实现。
简单的“总是四舍五入0.5”技术会导致对较大数字的轻微偏向。对于大量的计算,这是非常重要的。Python 3.0方法消除了这个问题。
常用的四舍五入方法不止一种。IEEE 754是浮点数学的国际标准,定义了五种不同的舍入方法(Python 3.0使用的是默认方法)。还有其他的。
这种行为并没有像它应有的那样广为人知。如果我没记错的话,AppleScript是这种舍入方法的早期采用者。AppleScript中的round命令提供了几个选项,但在IEEE 754中,round-向偶数是默认的。显然,实现round命令的工程师受够了“让它像我在学校学到的那样工作”的所有请求,所以他实现了:学校教的round 2.5舍入是一个有效的AppleScript命令。: -)
Python 3。X将.5值舍入为偶数的相邻值
assert round(0.5) == 0
assert round(1.5) == 2
assert round(2.5) == 2
import decimal
assert decimal.Decimal('0.5').to_integral_value() == 0
assert decimal.Decimal('1.5').to_integral_value() == 2
assert decimal.Decimal('2.5').to_integral_value() == 2
但是,如果需要,可以将十进制舍入“向后”更改为始终向上舍入。5:
decimal.getcontext().rounding = decimal.ROUND_HALF_UP
assert decimal.Decimal('0.5').to_integral_value() == 1
assert decimal.Decimal('1.5').to_integral_value() == 2
assert decimal.Decimal('2.5').to_integral_value() == 3
i = int(decimal.Decimal('2.5').to_integral_value()) # to get an int
assert i == 3
assert type(i) is int