Python rounding error with float numbers

This question already has an answer here:

  • Is floating point math broken? 23 answers

  • Any number that can't be built from exact powers of two can't be represented exactly as a floating point number; it needs to be approximated. Sometimes the closest approximation will be less than the actual number.

    Read What Every Computer Scientist Should Know About Floating-Point Arithmetic.


    Its very well known due to the nature of floating point numbers.

    If you want to do decimal arithmetic not floating point arithmatic there are libraries to do this.

    Eg,

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

    In general decimal is probably going overboard and still will have rounding errors in rare cases when the number does not have a finite decimal representation (for example any fraction where the denominator is not 1 or divisible by 2 or 5 - the factors of the decimal base (10)). For example:

    >>> 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
    

    So its best to always just round before casting floating points to ints, unless you want a floor function.

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

    Another alternative is to use the Fraction class from the fractions library which doesn't approximate. (It justs keeps adding/subtracting and multiplying the integer numerators and denominators as necessary).

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

    上一篇: 在Java程序中的点行为

    下一篇: 用float数字Python舍入错误