11
>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

What is going on here? How do I convert 0.47000000000000003 to string and the resultant value back to float?

I am using Python 2.5.4 on Windows.

cs95
  • 379,657
  • 97
  • 704
  • 746
Sharun
  • 2,030
  • 4
  • 22
  • 36
  • 3
    RC: I think many many people (yes, programmers too) don't eevn know that IEEE 754 defines floating-point numbers (not everyone reads language specifications :-)). So I'd actually think that the "floating-point" tag would be a better choice unless there are specific questions about the standard itself. – Joey Nov 22 '09 at 11:01
  • 5
    surely those that ask these kind of questions don't know what ieee-754 is... – sth Nov 22 '09 at 11:30
  • wasn't aware of the floating point tag but sure it's better than the name of the spec. –  Nov 22 '09 at 12:14

4 Answers4

16

str(0.47000000000000003) give '0.47' and float('0.47') can be 0.46999999999999997. This is due to the way floating point number are represented (see this wikipedia article)

Note: float(repr(0.47000000000000003)) or eval(repr(0.47000000000000003)) will give you the expected result, but you should use Decimal if you need precision.

  • Note: Use decimal here not only for precision but also for exactness. – Joey Nov 22 '09 at 11:02
  • I am not sure, but I perceive "precision" and "exactness" as synonyms, precision being the usual term. – tzot Dec 12 '09 at 23:31
  • 1
    See http://en.wikipedia.org/wiki/Precision_vs._accuracy - the numbers discussed are very precise but the problem discussed is that they are inaccurate. – gravitystorm Jun 11 '10 at 16:04
3

float (and double) do not have infinite precision. Naturally, rounding errors occur when you operate on them.

Alex Budovski
  • 17,947
  • 6
  • 53
  • 58
2

This is a Python FAQ

The same question comes up quite regularly in comp.lang.python also.

I think reason it is a FAQ is that because python is perfect in all other respects ;-), we expect it to perform arithmetic perfectly - just like we were taught at school. However, as anyone who has done a numerical methods course will tell you, floating point numbers are a very long way from perfect.

Decimal is a good alternative and if you want more speed and more options gmpy is great too.

Nick Craig-Wood
  • 52,955
  • 12
  • 126
  • 132
0

by this example I think this is an error in Python when you devide

    >>> print(int(((48/5.0)-9)*5))
    2

the easy way, I solve this problem by this

    >>> print(int(round(((48/5.0)-9)*5,2)))
    3