can you count the letter и in:
q: функция floor() как работает? каким будет результат выполнения следующего фрагмента кода: 
<?
echo floor((0.1+0.7)*10);
?>

и почему?
a: будет именно 7. потому что (0.1 + 0.7) * 10 не  будет 8, а будет 7.99(тут дальше будут любые цифры). а так как это число будет меньше 8, то результат будет 7. почему? особенности сложение вещественных чисел.
обновление для @alexwindhope и всех других, кто обвинил меня в незнании математики
почитайте на досуге стандарт  ieee 754 и поймите, что дробные числа не всегда могут быть представлены точно.
здесь http://www.h-schmidt.net/floatapplet/ieee754.html есть хороший апплет, который показывает, как именно выглядит число в внутри, в памяти. в частности:
0.1 = 0.1000000014 9011612
0.2 = 0.2000000029 8023224
0.7 = 0.6999999880 7907100

просуммировав все аккуратно имеем
0.1 + 0.7 = 0.79999998966918712
0.2 + 0.7 = 0.89999999105930324

то есть видим, хотя числа и близкие к желаемым, но все таки не равны им. я правда не нашел, как реализована в пхп функция floor, думаю оно бы прояснило, почему первому не хватило, а второму уже хватило, что бы перейти через разряд.
никогда не путайте школьную математику и процессорную.
еще одно обновление:
если пойти на сайт php и почитать, что пишут о типе float, то как раз там и приводят пример, данный вопрошающим:). всем новичкам читать до полного понимания.
a: это действительно проблема сложение вещественных чисел, но мне всеравно непонятно почему тогда floor работает например с 0.7+0.2, поидее тут должно выводить 8...
ну да собственно не суть, чтобы работало и не было таких вот чудес надо писать так:

                    echo floor(round(0.7+0.1, 1)*10); // -> 8


ps: примеры в комментах смотрел тут
upd
насколько я понимаю здесь все намного сложнее... и мне кажется что это плоское место реализации функции floor, дабы не быть голословным и уж точно разрушить то, что написал @kovadim приведу несколько примеров:
floor((0.0+0.1)*10); // -> 1
floor((0.1+0.1)*10); // -> 2
floor((0.2+0.1)*10); // -> 3
floor((0.3+0.1)*10); // -> 4
floor((0.4+0.1)*10); // -> 5
floor((0.5+0.1)*10); // -> 6
floor((0.6+0.1)*10); // -> 7
floor((0.7+0.1)*10); // -> 7
floor((0.8+0.1)*10); // -> 9

@kovadim - да, вы правы, протестил для 4.0 - фейл :)
но в данном случае round($num, 1) - решает эту проблему
ps: round(), в данном случае, я использовал именно для решения конкретной задачи
a: округление до меньшего значения
0.1+0.7 = 0,8*10 = 8.

а floor(8) = 8
a: ну чего же здесь непонятного? язык использует не десятичные, а двоичные дроби. вот если заменить 0.1 на 3/32 или на 25/256, и 0.7 заменить на что-то подобное, то результат получится совершенно предсказуемым.
user
In that passage, there are one hundred and four occurrences of the letter "и."
assistant