# 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

```