468,766 Members | 1,309 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,766 developers. It's quick & easy.

working of round()

Does round() always perfectly return the output expected or are there
some artifacts which don't allow perfect functionality

Using python 2.5:
>>round(12.234, 2)
12.23
>>round(12.234, 3)
12.234
>>round(12.234, 1)
12.199999999999999
>>>
but was expecting 12.2

Also, for round(x,n), can't 'x' be an expression

round(5.25/2, 2)

was expecting 2.62 , but
>>round(5.25/2, 2)
2.6299999999999999

Apr 16 '07 #1
3 1627
Kr************@gmail.com wrote:
Does round() always perfectly return the output expected or are there
some artifacts which don't allow perfect functionality

Using python 2.5:
>>>round(12.234, 2)
12.23
>>>round(12.234, 3)
12.234
>>>round(12.234, 1)
12.199999999999999

but was expecting 12.2
http://docs.python.org/tut/node16.html
Also, for round(x,n), can't 'x' be an expression

round(5.25/2, 2)

was expecting 2.62 , but
>>>round(5.25/2, 2)
2.6299999999999999
round(x, n) essentially does the following:

math.floor(x * 10**n + 0.5) / 10**n

Since (5.25/2)*100 == 262.5, adding 0.5 gives 263.0 and ultimately 2.63 as the
rounded number. round() does not do anything more complicated like round-to-even.

Use the decimal module if you want decimal arithmetic rather than binary
floating point.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

Apr 16 '07 #2
Kr************@gmail.com wrote:
Does round() always perfectly return the output expected or are there
some artifacts which don't allow perfect functionality

Using python 2.5:
>>>round(12.234, 2)
12.23
>>>round(12.234, 3)
12.234
>>>round(12.234, 1)
12.199999999999999

but was expecting 12.2

Also, for round(x,n), can't 'x' be an expression

round(5.25/2, 2)

was expecting 2.62 , but
>>>round(5.25/2, 2)
2.6299999999999999
You're running into floating-point issues (e.g. it's impossible to
represent 2.63 perfectly in binary). What are you really trying to do?
If you just want to format these with only two decimal places, use
string formatting::
>>'%.2f' % 12.234
'12.23'
>>'%.2f' % (5.25 / 2)
'2.63'

I'm not sure why you would have expected 2.62 for the latter when::
>>5.25 / 2
2.625

STeVe
Apr 16 '07 #3
On Apr 15, 8:06 pm, Krishna.K.1...@gmail.com wrote:
Does round() always perfectly return the output expected or are there
some artifacts which don't allow perfect functionality

Using python 2.5:
>round(12.234, 2)
12.23
>round(12.234, 3)
12.234
>round(12.234, 1)
12.199999999999999

but was expecting 12.2

Also, for round(x,n), can't 'x' be an expression

round(5.25/2, 2)

was expecting 2.62 , but
>round(5.25/2, 2)

2.6299999999999999
The problem is that floats are encoded as fractions where the
denominator is an exponent of 2.
2.63 is not representable as such a fraction.
2.629999999999999999999999999999999999... is the closest fraction.
Rounding this number will only give you the same thing.
If you want decimals to act as expected, use the Decimal class in
module decimal. It works as expected, but is much slower.

Apr 16 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

9 posts views Thread by David Veeneman | last post: by
4 posts views Thread by Chris Davoli | last post: by
5 posts views Thread by Marc | last post: by
7 posts views Thread by kkmigas | last post: by
4 posts views Thread by =?Utf-8?B?UmVuZQ==?= | last post: by
1 post views Thread by yappy70 | last post: by
18 posts views Thread by Philluminati | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by Marin | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.