Abs () - проблема с функцией абсолютного значения в PHP - PullRequest
2 голосов
/ 10 января 2012

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

Ответы [ 4 ]

6 голосов
/ 10 января 2012

Передавая числа с плавающей запятой в abs, вы получите число с плавающей запятой в результате. В этом случае у вас могут возникнуть проблемы с представлением с плавающей запятой: число с плавающей запятой никогда не бывает абсолютно точным, поэтому вы, скорее всего, получаете число, которое не точно 0,50, а что-то вроде 0,500000 ... 01. Вы можете попытаться округлить результат до желаемой точности (в вашем случае, я думаю, это два) с помощью функции php round.

1 голос
/ 10 января 2012

Если вы не хотите округлять в соответствии с предложением ответа @ Aldo и ваш сервер поддерживает математические функции GMP, вы можете вместо этого использовать gmp_abs().Таким образом, вы не столкнетесь с внутренними проблемами PHP с плавающей запятой.

1 голос
/ 10 января 2012

В связи с тем, как работает математика с плавающей запятой, ваше абсолютное значение $logic приводит к этому значению:

0.50000000000000022204

который равен больше 0,5

Примечание: выше, оценивается с использованием Javascript, который использует математику двойной точности для всех чисел:

Math.abs(1.83333333333 - 2.33333333333).toFixed(20)
0 голосов
/ 10 января 2012

Никогда не сравнивайте числа с плавающей точкой по равенству - используйте вместо этого технику эпсилона 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...