Может ли кто-нибудь объяснить, почему этот код делает это в отношении абс () (абсолютное значение). В моем коде он отобразит «БОЛЬШЕ» – хотя 0.50 никогда не БОЛЕЕ 0,5, я что-то пропускаю здесь с функцией abs?
$logic = abs(1.83333333333 - 2.33333333333); // 0.50 $limit = 0.50; if ($logic > $limit) { echo 'IS GREATER'; } else { echo 'IS NOT GREATER'; }
Передавая числа с плавающей запятой в abs, вы получите результат с плавающей запятой. В этом случае вы можете столкнуться с проблемами с представлением с плавающей запятой: плавающая точка никогда не является абсолютно точной, поэтому вы, скорее всего, получаете число, которое не точно 0,50, а что-то вроде 0,500000 … 01. Вы можете попытаться округлить результат до желаемой точности (в вашем случае, я думаю, это два) с функцией php round.
Если вы не хотите округлять, как было предложено ответом @ Aldo, и ваш сервер поддерживает математические функции GMP, вы можете использовать gmp_abs()
. Таким образом, вы не сталкиваетесь с присущими PHP проблемами с плавающей запятой.
Из-за того, как работает математика с плавающей запятой, ваша абсолютная величина $logic
приводит к этому значению:
0.50000000000000022204
который больше 0,5
NB: выше оценивается с использованием Javascript, который использует математику с двойной точностью для всех чисел:
Math.abs(1.83333333333 - 2.33333333333).toFixed(20)
Никогда не сравнивайте поплавки по принципу равенства – пользователь использует технику epsilon вместо PHP: числа с плавающей запятой
define('EPSILON', 1.0e-8); $logic = abs(1.83333333333 - 2.33333333333); // 0.50 $limit = 0.50; $diff = $logic - $limit; if (abs($diff) < EPSILON) echo 'IS EQUAL'; else echo 'IS NOT EQUAL';