Abs () – проблема с функцией абсолютного значения в PHP

Может ли кто-нибудь объяснить, почему этот код делает это в отношении абс () (абсолютное значение). В моем коде он отобразит «БОЛЬШЕ» – хотя 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'; } 

Solutions Collecting From Web of "Abs () – проблема с функцией абсолютного значения в PHP"

Передавая числа с плавающей запятой в 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';