Méthode de comparaison de nombres à virgule flottante PHP

Libérer: 2023-04-08 13:38:02
avant
3928 Les gens l'ont consulté

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 :

Copier après la connexion

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



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!

Étiquettes associées:
php
source:oschina.net
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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!