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

Я пытаюсь ответить. Если вы используете "===", вы также проверяете тип вместо значения. Если вы используете "==", вы просто проверяете, что это то же самое или нет.

вы можете ссылаться на здесь и здесь.