103 votes

PHP exprime deux chaînes différentes pour être les mêmes

Double Possible:
php == vs === opérateur
Comment faire de l'égalité (== égal double) et d'identité (=== triple égal) les opérateurs de comparaison diffèrent-ils?

Pourquoi la déclaration suivante de retour true?

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

J'ai aussi essayé avec des guillemets simples autour de chaînes de caractères. La seule façon que je peux le faire pour evaulate d' false est par l'utilisation de l' === opérateur au lieu de ==

Ma conjecture est que PHP est de le traiter comme une sorte d'équation, mais il semble un peu étrange.

Quelqu'un peut-il développer?

108voto

xdazz Points 85907

"608E-4234" est le flotteur format de nombre, de sorte qu'ils seront exprimés en nombre lorsqu'ils se compare.

608E-4234 et 272E-3063 seront float(0) parce qu'ils sont trop petits.

Pour == en php,

Si vous comparez un nombre avec une ficelle ou la comparaison implique des chaînes numériques, puis chaque chaîne est convertie en un nombre et de la comparaison effectuée numériquement.

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

À l'Attention de:

Quel est le comportement en javascript qui possède également les deux == et ===?

La réponse est le comportement est différent de PHP. En javascript, si vous comparez deux valeur de même type, == est juste comme ===, donc de type cast ne se produira pas pour comparer avec les deux même type de valeurs.

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)

Donc en javascript, si vous connaissez le type du résultat, vous pouvez utiliser == au lieu de === pour sauver un personnage.

Par exemple, typeof opérateur renvoie toujours une chaîne de caractères, de sorte que vous pouvez simplement utiliser

typeof foo == 'string' au lieu de typeof foo === 'string' avec pas de mal.

20voto

JvdBerg Points 11579

PHP utilise IEEE 754 pour les flottants, et vos nombres sont si petits qu'ils sont évalués à 0.

Voir: 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       
 

13voto

Matei Mihai Points 6312

Je pense que PHP lit ceci comme une syntaxe scientifique, qui sera traduite par:

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

PHP interprète cela comme étant 0 = 0 .

10voto

Matteo Tassinari Points 6496

PHP compare ces chaînes avec des nombres à virgule flottante, et elles sont toutes les deux nulles, vous devez donc utiliser l'opérateur === ,

5voto

Alfred Angkasa Points 549

Je suis en train de répondre. Si vous utilisez « === », vous aussi vérifier avec le type au lieu de la valeur. Si vous utilisez « == », vous il suffit de cocher que la valeur est la même ou non.

vous pouvez faire référence à ici et ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X