Возможный дубликат:
Оператор php == vs ===
Как различаются операторы сравнения равенства (== double equals) и идентичности (=== triple equals)?
Почему следующий оператор возвращает true
?
"608E-4234" == "272E-3063"
Я также пробовал это с одинарными кавычками вокруг строк. Единственный способ, которым я могу заставить его убедить в false
– это использовать оператор ===
вместо ==
Я предполагаю, что PHP относится к нему как к некоторому уравнению, но кажется немного странным.
Может ли кто-нибудь уточнить?
"608E-4234"
– это формат чисел с плавающей запятой , поэтому они сравниваются с числом.
608E-4234
и 272E-3063
будут float(0)
потому что они слишком малы.
Для ==
в php,
Если вы сравниваете число со строкой или сравниваете числовые строки , то каждая строка преобразуется в число, а сравнение выполняется численно.
http://php.net/manual/en/language.operators.comparison.php
Внимание:
Как насчет поведения в javascript, который также имеет и ==
и ===
?
Ответ в том, что поведение отличается от PHP. В javascript, если вы сравниваете два значения с одним типом, ==
точно так же, как ===
, поэтому тип cast не будет использоваться для сравнения с двумя значениями одного типа.
В 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'
без вреда.
PHP использует IEEE 754 для поплавков, и ваши номера настолько малы, что они имеют значение 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
Я думаю, что PHP читает это как научный синтаксис, который будет переведен как:
608 x 10^-4234 == 272 x 10^-3063
PHP интерпретирует это как 0 = 0
.
PHP сравнивает эти строки как числа с плавающей запятой, и оба они равны нулю, поэтому вы ДОЛЖНЫ использовать оператор ===
,
Я пытаюсь ответить. Если вы используете «===», вы также проверяете тип вместо значения. Если вы используете «==», вы просто проверяете, что это то же самое или нет.
вы можете ссылаться здесь и здесь .
Это то, что он видит:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=
http://www.wolframalpha.com/input/?i=272E-3063
Поскольку они не вписываются в переменную, они оба равны 0 или любое другое значение по умолчанию, которое выбирает php, и поэтому эквивалентны.