Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 311
sammiwei Avatar asked Aug 27 '13 19:08

sammiwei


2 Answers

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

like image 168
Bakuriu Avatar answered Sep 25 '22 09:09

Bakuriu


If you need accuracy don't use float, use Decimal

>>> from decimal import *
>>> d = Decimal(0.3125)
>>> getcontext().rounding = ROUND_UP
>>> round(d, 3)
Decimal('0.313')

or even Fraction

like image 26
Alexey Shrub Avatar answered Sep 23 '22 09:09

Alexey Shrub