Maison > Article > développement back-end > Méthode de comparaison de nombres à virgule flottante PHP
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 :
<?php $a = 15521.42; $b = 15480.3; $c = $a-$b; var_dump($c); //php4:float(41.120000000001) php5:float(41.12) var_dump($c == 41.12); //bool(false) ?>
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 >, 95ec6993dc754240360e28e0de8de30a= 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 :https://www.php.cn/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!