Python math is off by .000000000000045

Jussi Piitulainen jpiitula at ling.helsinki.fi
Wed Feb 22 19:44:52 CET 2012

```Alec Taylor writes:

> Simple mathematical problem, + and - only:
>
> >>> 1800.00-1041.00-555.74+530.74-794.95
> -60.950000000000045
>
> That's wrong.

Not by much. I'm not an expert, but my guess is that the exact value
is not representable in binary floating point, which most programming
languages use for this. Ah, indeed:

>>> 0.95
0.94999999999999996

Some languages hide the error by printing fewer decimals than they use
internally.

> Proof
> http://www.wolframalpha.com/input/?i=1800.00-1041.00-555.74%2B530.74-794.95
> -60.95 aka (-(1219/20))
>
> Is there a reason Python math is only approximated? - Or is this a bug?

There are practical reasons. Do learn about "floating point".

There is a price to pay, but you can have exact rational arithmetic in
Python when you need or want it - I folded the long lines by hand
afterwards:

>>> from fractions import Fraction
>>> 1800 - 1041 - Fraction(55574, 100) + Fraction(53074, 100)
- Fraction(79495, 100)
Fraction(-1219, 20)
>>> -1219/20
-61
>>> -1219./20
-60.950000000000003
>>> float(1800 - 1041 - Fraction(55574, 100) + Fraction(53074, 100)
- Fraction(79495, 100))
-60.950000000000003

```