float / rounding question

Piet van Oostrum piet at cs.uu.nl
Mon Mar 10 16:24:56 CET 2008


>>>>> Dennis Lee Bieber <wlfraed at ix.netcom.com> (DLB) wrote:

>DLB> On Fri, 07 Mar 2008 23:12:27 +0100, Piet van Oostrum <piet at cs.uu.nl>
>DLB> declaimed the following in comp.lang.python:


>>> Sorry to come in so late in this discussion. Although it is correct to say
>>> that many real numbers that have an exact decimal representation cannot be
>>> exactly represented in binary, that is no excuse to print 53.6 as
>>> 53.600000000000001. This is just lousy printing and the fact that this kind
>>> of question comes up every week shows that it is confusing to many people.
>>> 
>>>>> 53.6
>DLB> 53.600000000000001
>>>>> print 53.6
>DLB> 53.6
>>>>> print str(53.6)
>DLB> 53.6
>>>>> print repr(53.6)
>DLB> 53.600000000000001
>>>>> 

>DLB> 	Looks like "print" already does what you expect.

No, what you see is not the behaviour of `print' but of `str'. `print' uses
`str' to do the formatting instead of `repr' whereas the interactive prompt
uses `str'. `str' is meant to please the human reader, and `repr' is
supposed to give you something that you can use as input and get exactly
the same value. But `str' does it by just giving you less accuracy, thus
sweeping the problem under the carpet:

>>> str(53.59999999999)
53.6

>>> 53.59999999999==53.6
False

>>> repr(53.59999999999)
'53.599999999989997'

>>> 53.599999999989997==53.59999999999
True

>>> repr(53.6)
'53.600000000000001'

>>> 53.600000000000001==53.6
True

-- 
Piet van Oostrum <piet at cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: piet at vanoostrum.org



More information about the Python-list mailing list