Discutez du problème des nombres à virgule flottante inégaux en PHP

PHPz
Libérer: 2023-03-21 15:38:01
original
1530 Les gens l'ont consulté

PHP est un langage de programmation populaire et un langage de script côté serveur. En PHP, il possède des fonctionnalités flexibles et puissantes, il est donc largement utilisé dans le domaine du développement Web.

Dans la programmation PHP, nous rencontrons souvent des calculs de nombres à virgule flottante. Cependant, comme les nombres après la virgule flottante sont difficiles à représenter avec précision, cela conduira souvent à des résultats erronés lors de la comparaison de l'égalité de deux nombres à virgule flottante. . résultat.

Discutons de la question des nombres à virgule flottante inégaux en PHP.

Caractéristiques des nombres à virgule flottante

Un nombre à virgule flottante est un nombre utilisé pour représenter des décimales. Il comporte deux éléments : la mantisse et l'exposant. Dans la norme IEEE 754, les nombres à virgule flottante sont représentés en binaire.

Étant donné que la précision des nombres à virgule flottante changera à mesure que la taille de la valeur change, vous devez faire attention aux caractéristiques des nombres à virgule flottante lorsque vous effectuez des opérations de comparaison.

Par exemple :

$a = 0.1 + 0.2;
$b = 0.3;
echo ($a == $b) ? "Equal" : "Not Equal";
Copier après la connexion

Nous nous attendons à ce que le résultat de sortie soit égal. Cependant, le résultat réel est Inégal.

Pourquoi est-ce ? En effet, dans les ordinateurs, les nombres à virgule flottante sont stockés sous forme binaire, donc 0,1 et 0,2 sont des nombres décimaux infiniment récurrents lorsqu'ils sont convertis en binaire, et l'ordinateur ne peut utiliser qu'un nombre limité de chiffres pour les stocker. Par conséquent, lorsque l'ordinateur convertit 0,1 et 0,2 en binaire, ils ne sont pas stockés exactement et le résultat final est légèrement erroné. Cet écart s'accumulera lors de l'opération d'addition, rendant le résultat inégal à la valeur attendue.

La bonne façon de comparer des nombres à virgule flottante

En PHP, il existe plusieurs façons de comparer deux nombres à virgule flottante pour vérifier leur égalité. Présentons ces méthodes ci-dessous.

Méthode 1 : utilisez la fonction round() pour vérifier l'erreur

La fonction round() peut arrondir les nombres à virgule flottante à un nombre spécifié de chiffres. Par conséquent, lorsque nous voulons comparer l’égalité de deux nombres à virgule flottante, nous pouvons d’abord les arrondir au même nombre de décimales à l’aide de la fonction round(), puis les comparer.

Par exemple :

$a = 0.1 + 0.2;
$b = 0.3;
$precision = 14;
if (round($a, $precision) == round($b, $precision)) {
  echo "Equal";
} else {
  echo "Not Equal";
}
Copier après la connexion

Dans l'exemple ci-dessus, la variable $precision spécifie le nombre de décimales à arrondir. Dans cet exemple, nous utilisons la fonction round() pour arrondir deux nombres à 14 décimales, puis les comparer pour obtenir le résultat correct.

Méthode 2 : Utilisez la bibliothèque de calcul précise

Lorsque nous devons effectuer une comparaison précise en virgule flottante, nous pouvons utiliser la bibliothèque de calcul précise fournie par PHP. Cette bibliothèque fournit certaines fonctions permettant d'effectuer des calculs de haute précision sur des nombres à virgule flottante, évitant ainsi les erreurs qui se produisent lors des opérations sur les nombres à virgule flottante.

Les bibliothèques de calculs précis couramment utilisées incluent les bibliothèques BC Math et GMP. Les deux bibliothèques fournissent une série de fonctions capables d'effectuer diverses opérations en virgule flottante de haute précision, et les résultats des calculs sont les mêmes que les résultats réels.

Par exemple :

$a = "0.1";
$b = "0.2";
$c = "0.3";
$sum = bcadd($a, $b, 2); // 计算a和b的和
if (bccomp($sum, $c, 2) == 0) { // 比较计算结果和期望结果
  echo "Equal";
} else {
  echo "Not Equal";
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons la fonction bcadd() pour calculer la valeur de la variable $sum, puis utilisons la fonction bccomp() pour comparer si les valeurs de $sum et $ c sont égaux. La fonction bccomp() renvoie 0 pour l'égalité, 1 pour une somme $ supérieure à $c et -1 pour une somme $ inférieure à $c.

Conclusion

En raison des caractéristiques des nombres à virgule flottante, nous devons faire attention aux erreurs de calcul lors de la comparaison des nombres à virgule flottante pour l'égalité. Nous ne pouvons pas simplement utiliser "==" pour la comparaison, mais devons utiliser d'autres méthodes de comparaison, comme les arrondis et les calculs précis, attendez. Ce n'est qu'en maîtrisant la bonne méthode de comparaison que nous pourrons gérer correctement les opérations sur les nombres à virgule flottante en PHP.

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:
source:php.cn
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