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时必须对此进行一些讨论,但我无法找到一个很好的理由我的搜索。

  • 有没有人有洞察到为什么这改变了?
  • 有没有其他主流编程语言(例如,C,C ++,Java,Perl,..)对这种(对我来说是不一致的)四舍五入?
  • 我在这里错过了什么?

    更新:@ 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

    上一篇: Python 3.x rounding behavior

    下一篇: Jquery JSON response is undefined