Search code examples
pythonrounding

python incorrect rounding with floating point numbers


>>> a = 0.3135
>>> print("%.3f" % a)
0.314
>>> a = 0.3125
>>> print("%.3f" % a)
0.312
>>>

I am expecting 0.313 instead of 0.312 Any thought on why is this, and is there alternative way I can use to get 0.313?

Thanks


Solution

  • Python 3 rounds according to the IEEE 754 standard, using a round-to-even approach.

    If you want to round in a different way then simply implement it by hand:

    import math
    def my_round(n, ndigits):
        part = n * 10 ** ndigits
        delta = part - int(part)
        # always round "away from 0"
        if delta >= 0.5 or -0.5 < delta <= 0:
            part = math.ceil(part)
        else:
            part = math.floor(part)
        return part / (10 ** ndigits) if ndigits >= 0 else part * 10 ** abs(ndigits)
    

    Example usage:

    In [12]: my_round(0.3125, 3)
    Out[12]: 0.313
    

    Note: in python2 rounding is always away from zero, while in python3 it rounds to even. (see, for example, the difference in the documentation for the round function between 2.7 and 3.3).