Сравните плавания в php

Я хочу сравнить два плавания в PHP, как в этом примере кода:

$a = 0.17;
$b = 1 - 0.83; //0.17
if($a == $b ){
 echo 'a and b are same';
}
else {
 echo 'a and b are not same';
}

В этом коде это возвращает результат else условие вместо if условие, даже при том, что $a и $b то же. Там какой-либо специальный путь состоит в том, чтобы обработать/сравнить плавания в PHP?

Если да затем помогите мне решить эту проблему.

Или есть ли проблема с моей конфигурацией сервера?

142
задан mskfisher 9 May 2012 в 14:07
поделиться

2 ответа

Если вы сделаете это так, они должны быть такими же. Но обратите внимание, что характерной чертой значений с плавающей запятой является то, что вычисления, которые кажутся приводящими к одному и тому же значению, не обязательно должны быть идентичными. Таким образом, если $ a является литералом .17 и $ b прибывает туда посредством вычисления, вполне может быть, что они разные, хотя оба отображают одинаковое значение .

Обычно вы никогда не сравниваете значения с плавающей запятой на предмет равенства, подобного этому, вам нужно использовать наименьшее допустимое различие:

if (abs(($a-$b)/$b) < 0.00001) {
  echo "same";
}

Что-то вроде этого.

217
ответ дан 23 November 2019 в 23:02
поделиться

Сначала прочтите красное предупреждение в руководстве . Вы никогда не должны сравнивать числа с плавающей запятой на равенство. Вам следует использовать технику эпсилон.

Например:

if (abs($a-$b) < PHP_FLOAT_EPSILON) { … }

где PHP_FLOAT_EPSILON - константа, представляющая очень маленькое число (вы должны определить его в старых версиях PHP до 7.2)

53
ответ дан 23 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

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