floating point woes

Chris Rebert clp2 at rebertia.com
Wed Feb 16 01:24:59 CET 2011


On Tue, Feb 15, 2011 at 4:09 PM, Chris Rebert <clp2 at rebertia.com> wrote:
> On Tue, Feb 15, 2011 at 3:49 PM, Hans-Peter Jansen <hpj at urpla.net> wrote:
>> Hi,
>>
>> while I usually cope with the woes of floating point issues, this is
>> one, that I didn't expect:
>>
>>>>> round(2.385, 2)
>> 2.3799999999999999
>>
>> Doesn't the docs say, it's rounded up for this case?
>>
>> <quote>
>> Values are rounded to the closest multiple of 10 to the power minus n;
>> if two multiples are equally close, rounding is done away from 0
>> </quote>
>>
>> Well, that one is clearly rounding down.
>>
>> What's up, eh, down here?
>
> http://docs.python.org/library/functions.html#round :
> """
> Note: The behavior of round() for floats can be surprising: for
> example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This
> is not a bug: it’s a result of the fact that most decimal fractions
> can’t be represented exactly as a float. See "Floating Point
> Arithmetic: Issues and Limitations"[1] for more information.
> """
> [1]: http://docs.python.org/tutorial/floatingpoint.html
>
> And indeed:
>>>> from decimal import Decimal
>>>> Decimal(2.385)
> Decimal('2.3849999999999997868371792719699442386627197265625')
>
> Which, rounded to 2 decimal places, gives us 2.38, which is in turn
> approximated as:

[*whacks forehead hard*]
Nevermind.

- Chris



More information about the Python-list mailing list