Делимся секретами создания сайтов

Почему так происходит?

Пример кода:
$q=1;
do {
echo "Значение q достигло $q <br>";
$q = $q - 0.1;
}
while ($q != 0)
На выходе имею такое: (опачке!!!)

_Значение q достигло 1
Значение q достигло 0.9
Значение q достигло 0.8
Значение q достигло 0.7
Значение q достигло 0.6
Значение q достигло 0.5
Значение q достигло 0.4
Значение q достигло 0.3
Значение q достигло 0.2
Значение q достигло 0.1
Значение q достигло 1.38777878078E-16
Значение q достигло -0.1
Значение q достигло -0.2
Значение q достигло -0.3
Значение q достигло -0.4

=========
Что нового в HTML 5? статьи и обзоры.

Ответы: 9 → “Почему так происходит?”

  1. Дмитрий Артюков Ответить

    могу посоветовать "!=" заменить на">" )))
    А про 1.38777878078E-16 хзхзхзхз с 2004 в багтреке пхп висид вроде

  2. Плиско Вячеслав Ответить

    учим матчасть. php оперирует не десятичной системой, а двоичной, поэтому такие кажусы возможны, как и во многих других языках, для более точного расчёта нужно использовать bc*.

  3. Андрей Вольберг Ответить

    Вообще для многих языков пишут, что "не рекомендуется для float чисел использовать логические сравнения, основанные на равенстве (типа ==, !=)", как раз из-за таких вот косяков.

  4. Александр Усков Ответить

    да, вот последнее утверждение – тру.

    Ради эксперимента замените шаг цикла на 0.125 или 0.25

  5. Илья Ленин Ответить

    какое тогда решение? приводить число типа float в int? или можно по другому сравнивать?

  6. Дмитрий Макаренко Ответить

    Фигня какая-то. А нафига это?

    Помоему правда лучше написать while ($q > 0)
    А иначе он походу циклица.

  7. Илья Ленин Ответить

    ну "он" в обоих случаях "циклица". человек решил пойти через do-while. и я не думаю, что это было не оправдано…что тебе не нравится?

  8. Дмитрий Макаренко Ответить

    Ну не знаю. Я бы просто добавил while ($q > 0) для достоверности. Просто странно, что нужны ВСЕ значения кроме нуля. Так получается.

  9. Дмитрий Артюков Ответить

    $q=1;

    do {
    echo "Значение q достигло $q <br>";
    $q = $q – 0.1;
    }
    while ($q > 0.1);

    $q = 0;
    echo "Значение q достигло $q <br>";

    токо так тогда да ?* ))))))

Ответить