I had some problems with some Python projects that gave variable results that I could not track down. Eventually and reluctantly I converted them to Java. Later, when I had more time I tried to analyze what the Python code was doing and found something strange. The following snippet illustrates the problem.
>>> i = -50.0 >>> for x in xrange(5): i += 0.1 z = i * 10.0 print print z print int(z) -499.0 -499 -498.0 -498 -497.0 -496 -496.0 -495 -495.0 -494 The first two iterations look OK but after that the int(z) function returns the wrong value. It looks like the value was rounded down. If a just do this: >>> int(-497.0) -497 I get the value I expect. So what is the problem? It looks like a rounding problem but on the surface there is nothing to round. I am aware that there are rounding limitations with floating point arithmetic but the value passed to int() is always correct. What would cause it to be off by 1 full digit in only some cases? Perhaps something behind the scenes in the bowels of the interpreter ?. I could not get the thing to fail without being inside the for loop; does that have something to do with it? To fix the problem I could use round() or math.floor(). Like this. >>> i = -50.0 >>> for x in xrange(5): i += 0.1 z = i * 10.0 print print z print(round(z)) -499.0 -499.0 -498.0 -498.0 -497.0 -497.0 -496.0 -496.0 -495.0 -495.0 Why should I have to do this? Is there a general rule of thumb to know when this could be a problem? Should any float-to-int conversion be suspect? The above code was run in Python 2.5.4 on WinXP and Python 2.6.2 on Linux(Fedora12) Can anyone verify if this would be the same on 3.x? -- http://mail.python.org/mailman/listinfo/python-list