Francois Liot wrote:

>

> I observed a strange calculation answer, on both python 2.3.4 and 2.4.4

>

>> >> print 753343.44 - 753361.89

>

> -18.4500000001

>

>> >> print ( (753361.89*100) - (753343.44*100) ) / 100

>

> 18.45

>

> Can somebody help me to play correctly with decimal values?
A 64-bit binary floating point number can hold values between -1e308 and

+1e308, in only 64 bits of memory. Since 1e308 is a *lot* larger than

float(2**64) = ~1.8e19, it does this by splitting the number in a binary

fraction, and a multiplier (stored as an exponent).

Unfortunately, very few decimal fractions can be *exactly* represented

as binary fractions, so you often get representation errors:

http://docs.python.org/tut/node16.html
This is usually not much of a problem, since you usually end up rounding

things to a suitable number of decimals or significant digits when you

print them anyway (see below), but repr() doesn't do that -- it always

outputs enough digits to get back the *exact* binary representation if

you convert the string back to a floating point value again.

In practice, you can usually ignore this; just use the appropriate

output methods, and things will just work:

While pathological cases do exist, for most casual use of

floating-point arithmetic you'll see the result you expect

in the end if you simply round the display of your final

results to the number of decimal digits you expect. str()

usually suffices, and for finer control see the discussion

of Python's % format operator: the %g, %f and %e format codes

supply flexible and easy ways to round float results for

display.

(from the above link)

If you really need full control over this, no matter what, use the

Decimal type, as provided by the decimal module in the standard library.

See the library reference for the full story.

</F>