Rounding curiosity
PyBo
someone at somewhere.com
Wed Nov 17 01:13:33 EST 2004
Grant Edwards wrote:
> 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. :)
>
To all those who are feeling so smug and superior, perhapts you could
have noticed that I was pointing out that the round() function does not
perform as documented?
By the way,
print "%0.2f" % (5e8/(1024*1024))
yields the same result as
print "%0.2f" % round(5e8/(1024*1024),2)
so the 'round()' portion of the expression is superfluous.
More information about the Python-list
mailing list