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

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

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

17 августа 2003 09:06

Baka (инкогнито)
17 августа 2003, 12:28

Это ж прямо из документации :-)
<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>

bolk (bolknote.ru)
17 августа 2003, 12:28, ответ предназначен Baka

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

Улитка (инкогнито)
17 августа 2003, 12:30

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

bolk (bolknote.ru)
17 августа 2003, 12:30, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 12:32

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

bolk (bolknote.ru)
17 августа 2003, 12:32, ответ предназначен Улитка

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

Улитка (инкогнито)
17 августа 2003, 13:04

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

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

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

bolk (bolknote.ru)
17 августа 2003, 13:04, ответ предназначен Улитка

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

Algis (инкогнито)
17 августа 2003, 13:09

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

bolk (bolknote.ru)
17 августа 2003, 13:09, ответ предназначен Algis

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

Baka (инкогнито)
18 августа 2003, 07:16

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

bolk (bolknote.ru)
18 августа 2003, 07:16, ответ предназначен Baka

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)