Maison  >  Article  >  développement back-end  >  Explication détaillée des pièges les plus susceptibles de se produire avec les nombres et les chaînes PHP

Explication détaillée des pièges les plus susceptibles de se produire avec les nombres et les chaînes PHP

伊谢尔伦
伊谢尔伦original
2017-06-21 13:11:071760parcourir

0 Compare (opérateur est ==) avec toute chaîne de début qui n'est pas un nombre (ou, en d'autres termes, un caractère qui ne peut pas être converti en nombre), et renvoie vrai.

La raison est que lorsque vous comparez des nombres avec des chaînes, essayez d'abord de convertir la chaîne en nombre, puis comparez si une chaîne ne peut pas être convertie en nombre, le résultat de la conversion est 0, donc comparer avec 0 renvoie toujours vrai.

En PHP, lorsque deux chaînes numériques (chaînes contenant uniquement des nombres) sont comparées, elles sont directement converties en valeurs numériques pour comparaison

L'exemple suivant : (notez $a et $ bLes derniers chiffres des deux variables ne sont pas égaux)

Exemple de code :

<?php 
$a = &#39;511203199106034578&#39;; 
$b = &#39;511203199106034579&#39;; 
if ($a==$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

Exécutez le programme ci-dessus mais constatez que le résultat est égal (pas le résultat que nous pensions) Nous mettons respectivement $a et ajoutons une lettre a à $b

<?php 
$a = &#39;a511203199106034578&#39;; 
$b = &#39;a511203199106034579&#39;; 
if ($a==$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

Cette fois, la sortie n'est pas égale (le résultat correct)

Explication : L'exemple ci-dessus est égal parce que PHP combine deux chaînes numériques Convertissez en type numérique, et les deux nombres sont exactement égaux

<?php 
$a = 511203199106034578; 
$b = 511203199106034579; 
echo $a; // 输出 5.1120319910603E+17 即511203199106030000 
echo $b; // 输出 5.1120319910603E+17 即511203199106030000 
?>

Donc le résultat que nous obtenons dans l'exemple est égal
Pour éviter ce résultat inattendu, utilisez la comparaison de types Operator == =L'exemple suivant (si $a est égal à $b et que leurs types sont également les mêmes)

<?php 
$a = &#39;511203199106034578&#39;; 
$b = &#39;511203199106034579&#39;; 
if ($a===$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

Expliquez avec un exemple

<?php
$str1 = "123456789012345678";
$str2 = "123456789012345679";
if($str1 == $str2){
 echo "1.equal\n";
}esle{
 echo "1.not equal\n";
}
if($str1 === $str2){
 echo "2.equal\n";
}esle{
 echo "2.not equal\n";
}
if(strcmp($st1, $str2)==0){
 echo "3.equal\n";
}esle{
 echo "3.not equal\n";
}
if($str1 == $str2){
 echo "1.equal\n";
}esle{
 echo "1.not equal\n";
}

Le résultat après courir est assez étrange :

1.égal

2.pas égal

3.pas égal

Après avoir vérifié la raison, lorsque PHP compare deux chiffres chaînes, d'abord Ces deux chaînes seront traitées comme des nombres et stockées en notation scientifique, qui conserve 16 décimales. En d'autres termes, lors du stockage, $str1=1.2345678901234567E+17 ; $str2=1.2345678901234567E+17. On estime donc que $str1==$str2. Des longueurs différentes, l'ajout de caractères non numériques à la chaîne, etc. rendront les deux chaînes inégales. Par conséquent, il est recommandé d'utiliser le jugement triple signe égal si le type de données peut être déterminé, ou d'utiliser strcmp ou strcasecmp pour un jugement de type fort.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn