Python 3.x舍入行为
我刚刚重新阅读了Python 3.0中的新功能,并指出:
round()函数舍入策略和返回类型已更改。 准确的中途情况现在被舍入到最接近的偶数结果,而不是从零开始。 (例如,round(2.5)现在返回2而不是3)
和一轮文件:
对于支持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时必须对此进行一些讨论,但我无法找到一个很好的理由我的搜索。
我在这里错过了什么?
更新:@ Li-aungYip的评论“银行家的四舍五入”给了我正确的搜索词/关键字搜索,我发现这个问题:为什么.NET使用银行家的四舍五入作为默认?,所以我会仔细阅读。
Python 3.0的方式现在被认为是标准的四舍五入方法,尽管一些语言实现还没有在总线上。
简单的“始终围绕0.5升”技术会导致对较高数字的轻微偏差。 通过大量计算,这可能很重要。 Python 3.0方法消除了这个问题。
通常使用四舍五入的方法不止一种。 IEEE 754是浮点数学的国际标准,定义了五种不同的舍入方法(Python 3.0使用的方法是默认方法)。 还有其他的。
这种行为并不像它应该那样广为人知。 如果我没有记错的话,AppleScript是这种舍入方法的早期采用者。 AppleScript中的round
命令实际上提供了几个选项,但是在IEEE 754中默认是round-even-even。显然,执行round
命令的工程师对所有请求感到厌倦,“让它像我一样工作在学校学习“,他实现了这一点: round 2.5 rounding as taught in school
是一个有效的AppleScript命令。 :-)
您可以使用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')
在这里添加一个来自文档的重要说明:
https://docs.python.org/dev/library/functions.html#round
注意
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)
链接地址: http://www.djcxy.com/p/8503.html