Не удалось ввести равное значение в условие - PullRequest
0 голосов
/ 05 марта 2020

Каковы возможные шансы, что это значение не входит в условие?

$a = 106709.71; //value in first table
$b = 106709.71; //value in second table

Они оба десятичные в таблице.

У меня есть следующий код:

$a != $b ? '' : 'disabled';

Всегда возвращает отключенный.

Я пытался реплицировать его на PHP Эмулятор, но он работал, даже если другой объявлен как строка '106709.71' == 106709.71. Возвращает true.

Я попытался отобразить данные на внешнем интерфейсе, и они одинаковые, они оба 106709.71.

Я предполагаю, что другой отображается без запятой, но запятая есть.

Я обрезаю запятую для обоих значений, используя rtrim ($ var), и она работает.

Есть мысли о том, почему это происходит? Возможно ли, что он отображается на передней и задней панели без запятой, но на самом деле запятая есть?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Я думаю, что вы сталкиваетесь с проблемой сравнения десятичных дробей. Это не так просто. В https://www.php.net/manual/en/language.types.float.php есть хорошее описание того, почему вы не должны пытаться выполнить прямое сравнение и использовать другие методы:

Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от системы, PHP обычно использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16. Неэлементарные арифметические c операции могут давать большие ошибки, и, конечно, распространение ошибок должно учитываться при сложении нескольких операций.

Кроме того, рациональные числа, которые точно представимы в виде чисел с плавающей запятой в базе 10, как 0,1 или 0,7, не имеют точного представления в виде чисел с плавающей запятой в базе 2, которая используется внутри, независимо от размера мантиссы. Следовательно, они не могут быть преобразованы в их внутренние двоичные аналоги без небольшой потери точности. Это может привести к сбивающим с толку результатам: например, floor ((0.1 + 0.7) * 10) будет обычно возвращать 7 вместо ожидаемых 8, поскольку внутреннее представление будет примерно таким: 7.9999999999999991118 ....

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

Простое объяснение того, как это сделать, вы можете найти в Сравните десятичные дроби в PHP ответе. И весь этот сайт: Руководство по числам с плавающей точкой идет от простого к глубокому пониманию того, почему это происходит и как это исправить.

PS: В вашем вопросе есть опечатка $a != b ? '' : 'disabled';. Это должно быть $a != $b ? '' : 'disabled'; Это также может вызвать проблемы:)

0 голосов
/ 05 марта 2020

Я попробовал ваш случай, и я получил желаемый результат:

$a = 106709.71; //value in first table
$b = 106709.71; //value in second table

$result = ($a != $b) ? 'Not Equal' : 'Equal'; //return FALSE because it is equal

echo $result;

Выход

Equal

Если я сделаю изменение в сравнении, как:

$a = 106709.71; //value in first table
$b = 106709.71; //value in second table

$result = ($a == $b) ? 'Not Equal' : 'Equal'; //returns TRUE

echo $result;

Выход

Not Equal
...