Because you're actually comparing:
0.44999999999999996 < 0.45
Demo:
>>> x=0.35
>>> while (x<0.45):
x = x+0.05
print repr(x),"<",0.45, x<0.45
...
0.39999999999999997 < 0.45 True
0.44999999999999996 < 0.45 True
0.49999999999999994 < 0.45 False
print
calls str
on floats, which prints a human friendly version:
>>> print 0.44999999999999996
0.45
>>> print str(0.44999999999999996)
0.45
>>> print repr(0.44999999999999996)
0.44999999999999996