# Rounding curiosity

Grant Edwards grante at visi.com
Wed Nov 17 05:24:22 CET 2004

```On 2004-11-17, PyBo <bartley9 at pacbell.net> wrote:

> What's wrong with this picture?

Wrong is in the mind of the beholder.  ;)

>>>> x = 500000000.0
>>>> y = x / (1024 * 1024)
>>>> y
> 476.837158203125
>>>> z = round(y, 2)
>>>> z
> 476.83999999999997
>
> I have tried this and get the same result using different
> CPU's and operating systems.

There's a reason for that:

http://www.python.org/doc/faq/general.html#why-are-floating-point-calculations-so-inaccurate
http://docs.python.org/tut/node15.html

> Obviously, '476.83999999999997' is not rounded to two decimal
> places.

Of course it isn't.  Computers don't use decimal.  They use
binary: aye, there's the rub...

> Or am I doing something wrong?

You're using binary floating point math without understanding
it.  If you tell us what you're actually trying to accomplish,
we can probably tell you how to do it.

If you're just worried about how it looks on the screen:

>>> print "%0.2f" % round(5e8/(1024*1024),2)
476.84

If you want the computer to fib for you, it will. :)

--
Grant Edwards                   grante             Yow!  PUNK ROCK!! DISCO
at               DUCK!! BIRTH CONTROL!!
visi.com

```