[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Какая то ерунда с условием в цикле!
ApuktaChehov
Здравствуйте.
Есть вот такой цикл, с таким условием.
Я не понимаю, почему условие не срабатывает
for($x = 0.8; $x <= 2.1; $x += 0.1)
{
if($x == 1.2)
echo(123);
}


При это вот такое условие:
if($x > 1.3)
echo(123);

Срабатывает, когда $x равен 1.3.

Либо я туплю по страшному, либо...
Пролейте свет!

Спасибо!



Спустя 34 минуты (25.10.2010 - 14:36) silius написал(а):
Правильней будет так:

for($x = 0.8; $x <= 2.1; $x += 0.1)
{
if((string)$x == 1.2)
echo 123;
}

Спустя 3 минуты, 59 секунд (25.10.2010 - 14:40) ApuktaChehov написал(а):
Почему?

Спустя 8 минут, 17 секунд (25.10.2010 - 14:48) Michael написал(а):
все дело в этих жутких погрешностях php при работе с вещественными числами.
Типа вместо 1.2 на самом деле в php это 1.200002290232931 и уже сравнение не прокатит. Посмотри с точностью приведение.

Спустя 26 секунд (25.10.2010 - 14:48) linker написал(а):
Правильнее наверное будет использовать bcmath.

Спустя 5 минут, 37 секунд (25.10.2010 - 14:54) iehbr3333 написал(а):
for($x = 0.8; $x <= 2.1; $x=$x+.1)
{
echo " ", number_format($x, 100);
}


Посмотри что выводит в таком случае.

Спустя 7 минут, 31 секунда (25.10.2010 - 15:01) linker написал(а):
Осторожно предложу как вариант
for($x = 0.8; bccomp($x, 2.1, 1) <= 0; $x += 0.1)
{
if (bccomp($x, 1.2, 1) == 0) echo "123";
}
P.S. Или так
for($x = 0.8; bccomp($x, 2.1, 1) <= 0; $x += 0.1)
{
if ((string)$x == 1.2) echo "123";
}

Спустя 2 минуты, 57 секунд (25.10.2010 - 15:04) ApuktaChehov написал(а):
Все, я понял. Спасибо ребята. Мне больше всего понравилось использовать bcmath. rolleyes.gif

Сделал вот так:
for($x = 0.8; $x <= 2.1; $x += 0.1)
{
if(bccomp($x, 1.3, 1) == 0)
echo(123);
}

Спустя 6 минут, 41 секунда (25.10.2010 - 15:11) T1grOK написал(а):
Цитата (Michael @ 25.10.2010 - 11:48)
все дело в этих жутких погрешностях php при работе с вещественными числами.
Типа вместо 1.2 на самом деле в php это 1.200002290232931 и уже сравнение не прокатит. Посмотри с точностью приведение.

Это не совсем так. Вот сегодня наткнулся на статейку. PHP не проводит логические операции, когда сравнивает два числа с плавающей точкой.(журнал "PHPinsite" №18 2006).

Спустя 23 минуты, 30 секунд (25.10.2010 - 15:35) linker написал(а):
ApuktaChehov
А ты глянь на свой цикл, у тебя условие $x <= 2.1, но на деле при $x равным 2.1 такой итерации не будет, цикл остановится после $x = 2.

Спустя 47 минут, 50 секунд (25.10.2010 - 16:22) ApuktaChehov написал(а):
Да, я знаю, заметил.

Я понял, почему так происходит. Спасибо wink.gif


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.