Hello,
I am a newbie in Python and maybe this is a stupid question, but when I run this code I receive a very strange output.

``````status = 0
for i in range(10):
status = status + 0.1

if status == 0.1:
print status
elif status == 0.2:
print status
elif status == 0.3:
status
elif status == 0.4:
print status
elif status == 0.5:
print status
elif status == 0.6:
print status
elif status == 0.7:
print status
elif status == 0.8:
print status
elif status == 0.9:
print status
elif status == 1.0:
print status``````

At first I supposed that I will receive something like this:
>>>
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
>>>

But finally I was really surprised. Output looks like this:
>>>
0.1
0.2
0.4
0.5
0.6
0.7
>>>

Could somebody tells me what I am doing wrong?

This happens with many computer languages. You are trying to compare floating point values directly. Your 0.8 might be more like 0.799999999999999 and the compare flunks!

You can make this work by giving it a range you can compare within ...

``````if 0.79999 < status < 0.80001:
... do something```````

Look at the line following
elif status == 0.3:
And why do you have if/elif? Why not just print the value?

Thanks for an answer. It was just an example which really surprise me. But is there a way how to compare two float numbers without unpredictable results?

Well, there are actually three issues in the code:

(1) is a matter of efficiency, which woooee already raised.

``````status = 0
for i in range(10):
status = status + 0.1
print status``````

does what you wanted to do, and is cleaner to read. One payoff of this approach is that...

(2) ...in your original code, you didn't get 0.3 in the output because you left out the print statement. The lines

``````elif status == 0.3:
status``````

have the effect of evaluating, but not printing, status. And then throwing away the result, because you aren't doing anything with it.

(3) Finally, comparing floating points is a common source of bugs. Even if we worked with BCD, so that we didn't have to work about base-2 to base-10 errors, still and all, our decimal approximations would still lead to imprecision. For example, the test π == 3.14159265358979 is False.

Vega gives a very good approach to this by selecting a range. My own approach is to define a function that is in my code base:

``````def fuzzyequals(a,b,epsilon = 0.0001):
return abs(a-b) < epsilon``````

This function returns True if a is within the "halo" of b; that is, if b-epsilon < a < b+epsilon.

You can then use it like this:

``````...
if fuzzyequals(status,0.2):      # or fuzzyequals(status, 0.2, 0.01)
print status
...``````

Hope that helps,
Jeff

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.