Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Загадка про PHP. Номер 5.

Что выведет echo?

echo floor((0.1+0.7)*10);

12 комментариев
Baka 2003

Это ж прямо из документации :-)
<blockquote>
Never cast an unknown fraction to integer, as this can sometimes lead to unexpected results.
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
See for more information the warning about float-precision.
<blockquote>

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Baka:

Оттуда и есть :) А ты это всегда помнишь? :)

Улитка 2003

Выведет 7.
Почему — см. по адресу http://ru.php.net/manual/en/language.types.float.php

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Я знаю. Фокус не в том, чтобы заглянуть в руководство или запустить test.php.

Улитка 2003

Так не честно, я ссылку долго искал, а он взял просто и скопировал!

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Вот прямо так все и знают? :)

Улитка 2003

За кого вы меня принимаете! Я еще ни разу не запускал эти примеры на PHP, о чем говорят мои ошибки.

Заглянул в руководство, да. Потому что подвох заподозрил, решил посмотреть про числа с плавающей запятой. Заметь, не 0.1+0.7. Руководство было локальное, chm, но я больше привык линкам доверять, потому и полез на php.net искать.

Если фокус заключается в том, чтобы учить руководство наизусть, то мне таких фокусов не надо. Руководство на то и есть, чтобы им пользоваться.

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Улитка:

Согласен. Не к чему горячится. Я этими задачами опытом делюсь. Часть из них — то, на чём я обжёгся, часть — то, над чем задумался, часть — то, что случайно нашёл в руководстве в своё время.

Algis 2003

echo floor((0.0+0.7)*10); -> 07
echo floor((0.1+0.7)*10); -> 07
echo floor((0.2+0.7)*10); -> 09
нелогично …

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Algis:

Всё дело в хранении этих чисел. Вот ссылка, где подробно написано: http://www.php.net/manual/ru/language.types.float.php (rus)

Baka 2003

<blockquote>
BOLK: Оттуда и есть :) А ты это всегда помнишь? :)
</blockquote>
Этот конкретный пример — не всегда. :)
На этот пример наткнулся случайно — когда смотрел
про преобразования типов (для примера про «логический» тип).
А то, что «10.0 times 0.1 is hardly ever 1.0.»
(это из файла /usr/share/games/fortunes/fortunes ^_~) —
это в любом приличном учебнике по программированию написано
(если про плавающую точку там упоминается).
На МК-61 даже «2 в степени 2» было 3.99999996 (число девяток не помню). :-)

Евгений Степанищев (bolknote.ru) 2003

Комментарий для Baka:

Вообще неудобно, что такие вещи присутствуют. Это же почти баг. Или не почти.