2012-09-26 8 views
101

Duplicar posible:
php == vs === operator
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?PHP expresa dos cuerdas diferentes que ser el mismo

¿Por qué la siguiente instrucción de retorno true?

"608E-4234" == "272E-3063" 

También he intentado esto con comillas simples alrededor de las cuerdas. La única manera que puedo conseguir que evaulate a false es usando el operador === en lugar de ==

Mi conjetura es PHP está tratando como una especie de ecuación pero parece un poco extraño.

¿Alguien puede explicarlo?

+5

echo 608E-4234 = 0; echo 272E-3063 = 0; 0 == 0 –

+3

¿Qué dice http://php.net/strcmp? – Bokw

+14

[PHP está escrito de manera débil/floja] (http://stackoverflow.com/questions/467871/what-is-a-loosely-typed-language). Dependiendo del contexto, lo que usted reclama es una cadena, es algo más de hecho. Así que mejor use '===' si quiere comparar cadenas. Conozca a sus operadores. – hakre

Respuesta

107

"608E-4234" es float number format, por lo que se convertirán en números cuando se comparan.

608E-4234 y 272E-3063 serán ambos float(0) porque son demasiado pequeños.

Para == en php,

Si se compara un número con una cuerda o la comparación incluye cadenas numéricas, entonces cada cadena se convierte en un número y la comparación realiza numéricamente.

http://php.net/manual/en/language.operators.comparison.php

Atención:

¿Qué pasa con el comportamiento en javascript que también tiene tanto == y ===?

La respuesta es que el comportamiento es diferente de PHP. En javascript, si compara dos valores con el mismo tipo, == es lo mismo que ===, por lo que no se aplicará el tipo de conversión para comparar con dos valores del mismo tipo.

En 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) 

Así que en javascript, cuando se conoce el tipo del resultado, se puede utilizar en lugar de ===== para salvar un carácter.

Por ejemplo, typeof operador siempre devuelve una cadena, por lo que sólo podría utilizar

typeof foo == 'string' en lugar de typeof foo === 'string' sin daño.

+4

Bit importante del manual sobre [comparaciones del operador] (http://php.net/manual/en/language.operators.comparison.php): * Si compara un número con una cadena ** o la comparación implica cadenas numéricas **, cada cadena se convierte en un número y la comparación se realiza numéricamente. * –

+26

Vea también: http://phpsadness.com/sad/47 – nickgrim

+5

'Cadenas numéricas' -> [Qué.] (http: // tvtropes .org/pmwiki/pmwiki.php/Main/FlatWhat) No hace que sea aún más difícil escribir aplicaciones seguras en PHP. –

5

Estoy tratando de responder. Si está utilizando "===", también verifica con el tipo en lugar del valor. Si está utilizando "==", simplemente verifique que el valor sea el mismo o no.

puede hacer referencia a here y here.

10

PHP está comparando esas cadenas como números en coma flotante, y ambos son cero, por lo que MUST utiliza el operador ===,

+2

Como dije en mi respuesta, eso se debe a que las dos cadenas se comparan como números de punto flotante, que se redondean a cero, por lo tanto son ** iguales ** pero no ** idéntico ** –

20

PHP usa IEEE 754 para los flotadores, y sus números son tan pequeñas que evalue a 0.

Ver: 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  
+2

Pero no estaba comparando carrozas, está comparando cuerdas. Entonces, ¿qué PHP usa para flotantes ** debería ** ser irrelevante – jalf

+2

@jalf php está tipeado libremente y está convirtiendo los valores detrás de las escenas == es malo si no está familiarizado con el lenguaje, si quería compararlos como cadenas que necesitaba usar === o strcmp como otros han mencionado. – stoj

+7

@stoj sí, pero mi punto es que esta respuesta no responde a la pregunta: describe la representación fp utilizada por PHP, pero no establece el hecho importante de que "si su cadena se ve como un valor FP, se convertirá en un valor FP ". – jalf

13

creo que PHP lee esto como una sintaxis científica, que se traduce como:

608 x 10^-4234 == 272 x 10^-3063 

PHP lo interpreta como 0 = 0.

Cuestiones relacionadas