It is quite usual that simple decimal fractions like
0.1 or 0.7 cannot be
converted into their internal binary counterparts without a
little loss of precision. This can lead to confusing results: for
example, floor((0.1+0.7)*10) will usually
return 7 instead of the expected
8 as the result of the internal representation
really being something like 7.9999999999....
This is related to the fact that it is impossible to exactly
express some fractions in decimal notation with a finite number
of digits. For instance, 1/3 in decimal form
becomes 0.3333333. . ..
So never trust floating number results to the last digit and
never compare floating point numbers for equality. If you really
need higher precision, you should use the arbitrary precision math functions
or gmp functions instead.