Maison  >  Article  >  développement back-end  >  Méthode de comparaison de nombres à virgule flottante PHP

Méthode de comparaison de nombres à virgule flottante PHP

尚
avant
2020-03-25 09:20:513993parcourir

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer