用float数字Python舍入错误

这个问题在这里已经有了答案:

  • 浮点数学是否被破坏? 23个答案

  • 任何不能用精确的二次幂构建的数字都不能完全表示为浮点数; 它需要近似。 有时最接近的近似值会小于实际值。

    阅读每位计算机科学家应该了解的浮点运算。


    它由于浮点数的性质而广为人知。

    如果你想做十进制算术而不是浮点算术,有库可以做到这一点。

    例如,

    >>> from decimal import Decimal
    >>> Decimal(29)/Decimal(100)
    Decimal('0.29')
    >>> Decimal('0.29')*100
    Decimal('29')
    >>> int(Decimal('29'))
    29
    

    一般来说,小数可能会过大,并且在数字不具有有限小数表示的情况下(例如,分母不是1或可被2或5整除的任何分数 - 十进制基数的因子(10))。 例如:

    >>> s = Decimal(7)
    >>> Decimal(1)/s/s/s/s/s/s/s*s*s*s*s*s*s*s
    Decimal('0.9999999999999999999999999996')
    >>> int(Decimal('0.9999999999999999999999999996'))
    0
    

    因此,除非您需要发言权函数,否则在将浮点数转换为整数之前,最好始终进行一轮调整。

    >>> int(1.9999)
    1
    >>> int(round(1.999))
    2
    

    另一种替代方法是使用分数库中的分数类,它不是近似的。 (它只是在必要时加/减和乘以整数分子和分母)。

    链接地址: http://www.djcxy.com/p/27451.html

    上一篇: Python rounding error with float numbers

    下一篇: 1.265 * 10000 = 126499.99999999999?