PHP выражает две разные строки одинаковыми
Возможный дубликат:
php == vs === operator
Чем отличаются операторы сравнения равенства (== double equals) и идентичности (=== triple equals)?
Почему следующий оператор возвращает true
?
"608E-4234" == "272E-3063"
Я также пробовал это с одинарными кавычками вокруг строк. Единственный способ, которым я могу убедить его в false
, - это использовать оператор ===
вместо ==
Я предполагаю, что PHP рассматривает это как своеобразное уравнение, но кажется немного странным.
Может кто-нибудь уточнить?
Ответы
Ответ 1
"608E-4234"
- это формат чисел с плавающей запятой, поэтому они будут отбрасываться в число, когда они сравниваются.
608E-4234
и 272E-3063
оба будут float(0)
, потому что они слишком малы.
Для ==
в php,
Если вы сравниваете число со строкой или сравниваете, числовые строки, то каждая строка преобразуется в число и сравнение выполнено численно.
http://php.net/manual/en/language.operators.comparison.php
Внимание:
Как насчет поведения в javascript, который также имеет как ==
, так и ===
?
Ответ - это поведение отличается от PHP. В javascript, если вы сравниваете два значения с одним и тем же типом, ==
точно так же, как ===
, поэтому приведение типов не произойдет для сравнения с двумя значениями одного и того же типа.
В javascript:
608E-4234 == 272E-3063 // true
608E-4234 == "272E-3063" // true
"608E-4234" == 272E-3063 // true
"608E-4234" == "272E-3063" // false (Note: this is different form PHP)
Итак, в javascript, когда вы знаете тип результата, вы можете использовать ==
вместо ===
для сохранения одного символа.
Например, оператор typeof
всегда возвращает строку, поэтому вы можете просто использовать
typeof foo == 'string'
вместо typeof foo === 'string'
без вреда.
Ответ 2
PHP использует IEEE 754 для float, и ваши номера настолько малы, что они имеют значение 0.
Смотрите: http://en.wikipedia.org/wiki/IEEE_floating_point
Name Common name Base Digits E min E max
binary32 Single precision 2 23+1 −126 +127
binary64 Double precision 2 52+1 −1022 +1023
Ответ 3
Я думаю, что PHP читает это как научный синтаксис, который будет переведен как:
608 x 10^-4234 == 272 x 10^-3063
PHP интерпретирует это как 0 = 0
.
Ответ 4
PHP сравнивает эти строки как числа с плавающей запятой, и оба они равны нулю, поэтому вы ДОЛЖНЫ использовать оператор ===
,
Ответ 5
Я пытаюсь ответить.
Если вы используете "===", вы также проверяете тип вместо значения.
Если вы используете "==", вы просто проверяете, что это то же самое или нет.
вы можете ссылаться на здесь и здесь.
Ответ 6
Это то, что он видит:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=
http://www.wolframalpha.com/input/?i=272E-3063
Поскольку они не вписываются в переменную, они оба равны 0 или любые значения по умолчанию, которые выбирает php, и поэтому эквивалентны.