Is round() broken?

Thomas Jensen thomasNO at SPAM.obscure.dk
Wed Oct 31 23:27:08 CET 2001


"Joseph Wilhelm" <jwilhelm at outsourcefinancial.com> wrote in
news:mailman.1004561433.28620.python-list at python.org: 

> Hello again everybody!
> 
> I'm having some troubles with round() now... either I'm doing it
> completely wrong or round() is.  But here's what I'm getting.
> 
>>>> round( 43583.010000000002, 2 ) 43583.010000000002 round(
>>>> 43583.010000000002 ) 43583.0 round( 43583.010000000002, 1 )
>>>> 43583.0 round( 43583.010000000002, 2 ) 43583.010000000002 
>>>>
> 
> So, what this is saying.. is that rounding to 1 decimal point
> works... but anything beyond that is broken?  Rounding negative
> will round the number before the decimal point also.

You're probably seeing this, because the number cannot be represented 
precisely as a float. This is the nature of floating point numbers, the 
way they are represented by most (all?) CPUs today, and thus not a 
problem specific to Python. the number 1.1 is another example of this.
If you want to get a string representation of the number with only 2 
digits, try '%.2f' % number.
http://www.python.org/doc/current/lib/typesseq-strings.html

A python session:
>>> round( 43583.010000000002, 2 )
43583.010000000002
>>> '%.2f' % 43583.010000000002
'43583.01'
>>> eval('%.2f' % 43583.010000000002)
43583.010000000002
>>> 43583.01
43583.010000000002
>>> 1.1
1.1000000000000001

> And actually, as a side question.. that number was pulled from a
> float8 field in a Postgres database, using the 'pg' module. If I
> look at the field through pgAdmin, I just see it as "43583.01",
> instead of that whole big long decimal. Is it supposed to come out
> like this? 

Perhaps the float8 datatype is stored differently than python floats ?

-- 
Best Regards
Thomas Jensen



More information about the Python-list mailing list