[Tutor] Re: If elif not working in comparison
Christopher Smith
smiles at saysomething.com
Mon Apr 4 20:08:46 CEST 2005
On Monday, Apr 4, 2005, at 05:01 America/Chicago,
tutor-request at python.org wrote:
> Would I used an if else: construction to determine where the INR value
> lay and decide what precentage to increase it by?
>
Yes, that seems to be the right way to do that. The caveat is that
when you are using boolean tests like "if INR < 1.15:" you are using
floating point numbers that *by definition* have limited ability to
represent the numbers you type.
"1.15" is actually "1.1499999999999999", so calculation that "on paper"
would have led to a value of 1.15 will appear to be larger than the
floating point value of 1.15. When you are checking to see if your
program is running right and you find that a test like "if INR < 1.15"
doesn't work like you think it should this can lead to a lot of hair
pulling...until you remember the floating point issue. e.g. on paper,
a and b as shown below should be the same, but they aren't
###
>>> a=.23*5 # which equals 1.15 on paper
>>> b=1.15
>>> a==b
False
>>> a
1.1500000000000001
>>> b
1.1499999999999999
###
If one cares about what side of the boundary values get evaluated to
then either exact numbers should be used (e.g. the new decimal type of
python 2.4) or else the tests should use the round function to get both
numbers to a compatible precision for comparison (e.g. use "if
round(INR,2) < round(1.15,2):" instead of "if INR < 1.15".
It is instructive to see what the round function does to the a and b
used in the example above:
###
>>> a,b=round(.23*5,2),round(1.15,2)
>>> a==b
True
>>> a
1.1499999999999999
>>> b
1.1499999999999999
###
Both numbers are still floats, but they are floats that both best
represent, to 2 decimal places, their respective values.
/c
More information about the Tutor
mailing list