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

伊谢尔伦
Libérer: 2023-03-10 22:28:02
original
1776 Les gens l'ont consulté

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;; 
} 
?>
Copier après la connexion

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;; 
} 
?>
Copier après la connexion

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 
?>
Copier après la connexion

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;; 
} 
?>
Copier après la connexion

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";
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal