Задать вопрос
@rinaz22

Что за мистика с условием при дробных числах?

Всем привет. Проверяю дробные числа на меньше(<):
<?
$a = 260 * 0.98;
if ($a < 254.8) {
	echo "Error<br>";
}
echo $a;
?>

Что не так? Выходит 254.8, но условие говорит что меньше, т.к. выходит Error
Error
254.8

Пробовал и float и double
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Нужно округлить
$a = 260 * 0.98;

if (round($a, 1) < 254.8) {
  echo "Error";
}

var_dump($a);
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<?php
$a = round(260 * 0.98, 1);

if ($a < 254.8) 
{
  echo "{$a} < 254.8";
} 

if ($a == 254.8) 
{
  echo "{$a} == 254.8";
} 

if ($a > 254.8) 
{
  echo "{$a} > 254.8";
} 

//254.8 == 254.8
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
А в чем подвох? Почему без round не работает?


Нормально и инженерно: по ссылке в этом ответе Не могу понять почему работает последняя исключения?
Познавательно и просто (в самом начале видео про эту ошибку как раз): Опасные ошибки, которые мы не замечаем
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Преобразуем в строку:$a = 260 * 0.98.'';
Ответ написан
Комментировать
Delgus
@Delgus
float и double так работают. читать официальную доку например - https://www.php.net/manual/ru/language.types.float.php
там написано следующее

Так что никогда не доверяйте точности чисел с плавающей запятой до последней цифры и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы