
Il y a un dicton dans le manuel PHP : ne comparez jamais deux nombres à virgule flottante pour vérifier leur égalité.
La façon dont les nombres à virgule flottante sont traités en interne par les ordinateurs détermine que les nombres à virgule flottante ne peuvent pas être précis à 100 %, il y aura donc une perte de précision lors du traitement des opérations sur les nombres à virgule flottante. Par exemple, le programme suivant :
La première instruction de sortie : Sous PHP4, la sortie $c peut être 41,120000000001, ou des résultats similaires, et le 1 suivant fait partie de la perte de précision. Certaines "optimisations" ont été apportées à ce problème dans PHP5. La partie inexacte ne sera pas affichée dans les résultats de sortie, mais en même temps, nous ignorerons ce problème et penserons que $c==41.12.
La deuxième instruction de sortie : false sera affichée en PHP4 et PHP5.
Avertissement : il ne s'agit pas d'un problème PHP, mais d'un problème lié au traitement interne des nombres à virgule flottante par l'ordinateur ! Le même problème sera rencontré en C/JAVA.
Extension : Nous ne pouvons pas non plus utiliser >, <, >= ou <=
Alors, comment devrions-nous comparer deux nombres à virgule flottante pour vérifier l'égalité ?
Après avoir lu l'introduction ci-dessus, nous savons : il n'y a aucun moyen de comparer avec précision deux nombres à virgule flottante pour l'égalité ! Donc... nous ne pouvons comparer que dans la plage de précision souhaitée (par exemple, dans l'exemple ci-dessus, il suffit de comparer $c pour qu'il soit égal à 41,12 à deux décimales près).
Ce qui suit est un exemple tiré des commentaires du manuel PHP
nction floatcmp($f1,$f2,$precision = 10) {// are 2 floats equal $e = pow(10,$precision); $i1 = intval($f1 * $e); $i2 = intval($f2 * $e); return ($i1 == $i2); } function floatgtr($big,$small,$precision = 10) {// is one float bigger than another $e = pow(10,$precision); $ibig = intval($big * $e); $ismall = intval($small * $e); return ($ibig > $ismall); } function floatgtre($big,$small,$precision = 10) {// is on float bigger or equal to another $e = pow(10,$precision); $ibig = intval($big * $e); $ismall = intval($small * $e); return ($ibig >= $ismall); }
Recommandations associées :
Tutoriel vidéo PHP ://m.sbmmt.com/course/list/29/type/2.html
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!
Comment ouvrir le fichier php
Comment supprimer les premiers éléments d'un tableau en php
Que faire si la désérialisation php échoue
Comment connecter PHP à la base de données mssql
Comment connecter PHP à la base de données mssql
Comment télécharger du HTML
Comment résoudre les caractères tronqués en PHP
Comment ouvrir des fichiers php sur un téléphone mobile