Maison > développement back-end > tutoriel php > Pourquoi les comparaisons à virgule flottante en PHP échouent-elles parfois et comment pouvons-nous les comparer correctement ?

Pourquoi les comparaisons à virgule flottante en PHP échouent-elles parfois et comment pouvons-nous les comparer correctement ?

DDD
Libérer: 2024-12-23 16:56:11
original
800 Les gens l'ont consulté

Why Do Floating-Point Comparisons in PHP Sometimes Fail, and How Can We Correctly Compare Them?

Comparaison de nombres à virgule flottante en PHP

Lors de la comparaison de nombres à virgule flottante en PHP, il est essentiel de gérer les différences subtiles dans leur représentation et leur précision. Cela peut être difficile, comme l'illustre le code suivant :

<?php
$a = 0.17;
$b = 1 - 0.83; // 0.17

if ($a == $b) {
    echo 'a and b are same';
} else {
    echo 'a and b are not same';
}
?>
Copier après la connexion

Dans ce code, vous pouvez vous attendre à ce que la condition if soit vraie puisque $a et $b représentent la même valeur. Cependant, il est évalué de manière inattendue comme faux, indiquant que $a et $b ne sont pas égaux.

Pourquoi la comparaison échoue

La raison de cet écart réside dans la représentation interne des nombres à virgule flottante dans les ordinateurs. Ces chiffres sont des approximations et leur précision est limitée. Lors de l'exécution de calculs à virgule flottante, de petites erreurs d'arrondi peuvent s'accumuler, conduisant à des résultats inattendus lors de leur comparaison d'égalité.

Gestion des comparaisons de flotteurs

Pour résoudre ce problème, vous devez éviter de comparer les flotteurs à l'aide de l'option opérateur d'égalité stricte (==) sauf si vous êtes absolument certain qu'ils représentent la même valeur. Utilisez plutôt la fonction abs() et comparez la différence absolue entre les deux valeurs par rapport à une petite tolérance acceptable.

Par exemple, vous pouvez utiliser le code suivant pour comparer $a et $b avec une tolérance de 0,00001. :

if (abs(($a - $b) / $b) < 0.00001) {
    echo "a and b are same";
} else {
    echo "a and b are not same";
}
Copier après la connexion

Cette méthode fournit un moyen plus fiable de comparer les flotteurs à des fins pratiques.

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 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