[Tutor] why gtk.Entry does not give me right answers?

Lion Chen chnlion79 at gmail.com
Tue Apr 24 05:00:30 CEST 2012


于 2012年04月23日 23:08, Steven D'Aprano 写道:
> Lion Chen wrote:
>> Hi, All,
>>
>> i am trying write a calculator, now normal calculation works ok. but if
>> i enter long numbers, for example 333333333333333333 + 7, it gives me
>> "333333333333333312".....
>>
>> there are 18 "3"s, if the length is more than 17, the calculation will
>> be wrong on Windows and Ubuntu.
> You are losing precision by converting into a float. Watch:
>
>>>> n = 333333333333333333
>>>> n + 7
> 333333333333333340
>>>> int(float(n))
> 333333333333333312
>>>> int(float(n)+7)
> 333333333333333312
>
> Your integer value 333...333 requires 59 bits to store the entire number, but
> Python floats are C doubles, which only have 52 bits available for the numeric
> digits. (The other 12 bits encode the sign and exponent.)
>
> http://www.johndcook.com/blog/2009/04/06/anatomy-of-a-floating-point-number/
>
> You cannot store 3333...333 exactly as a float. The two closest floats are:
>
> 333333333333333312.0
> 333333333333333376.0
>
> so all numbers between them will be rounded up or down.
>
> Some possible solutions:
>
> * Don't try to mix infinite-precision integer arithmetic with finite-precision
>    float arithmetic.
>
> * Don't convert to float unless you really need to, e.g. if the string
>    contains a decimal point.
>
> * Use the decimal module instead of floats. You still have finite precision,
>    but you can choose how many *decimal* places to store instead of having a
>    fixed number of *binary* places. (But decimal is much slower.)
>
>
> By the way, the code that you sent is unreadable. Please make sure that you
> send plain text email, and that indentation is not lost. Without indentation,
> it is impossible to understand your code.

many thanks, Steve, i see, and i have solved it :) .

and the codes in my thunderbird shows ok, so i thought it would be ok in 
yours, sorry for that....

Lion
>
>



More information about the Tutor mailing list