Maison  >  Article  >  développement back-end  >  Compréhension approfondie du phénomène des décimales à virgule flottante inégales en PHP

Compréhension approfondie du phénomène des décimales à virgule flottante inégales en PHP

WBOY
WBOYoriginal
2024-03-08 16:00:05316parcourir

Compréhension approfondie du phénomène des décimales à virgule flottante inégales en PHP

PHP est un langage de programmation largement utilisé dans le développement Web, dans lequel le traitement des nombres à virgule flottante a toujours été un problème auquel les développeurs doivent prêter attention. Dans le développement réel, nous rencontrons souvent le phénomène selon lequel les nombres à virgule flottante ne sont pas égaux, ce qui est souvent dû à la perte de précision causée par la forme binaire des nombres à virgule flottante dans l'ordinateur. Dans cet article, nous allons approfondir l’inégalité en virgule flottante en PHP et l’illustrer avec des exemples de code concrets.

Tout d’abord, commençons par un exemple simple. Supposons que nous ayons deux nombres à virgule flottante $a = 0,1 + 0,2$ et $b = 0,3$. Nous nous attendons à ce que ces deux nombres soient égaux, mais dans la programmation réelle, ils peuvent ne pas être égaux. Vérifions-le avec le code suivant :

$a = 0.1 + 0.2;
$b = 0.3;

if ($a == $b) {
    echo "相等";
} else {
    echo "不相等";
}

Exécutez le code ci-dessus, nous constaterons que le résultat de sortie n'est "pas égal". En effet, dans les ordinateurs, les nombres 0,1, 0,2 et 0,3 sont des nombres décimaux infiniment récurrents lorsqu'ils sont représentés en binaire, ils ne peuvent donc pas être représentés avec une précision totale. Une légère erreur s'est produite lors du calcul de $a = 0,1 + 0,2$, ce qui fait que la valeur de $a$ est en fait un nombre très proche de 0,3 mais pas exactement égal à 0,3.

Pour comprendre ce problème plus en profondeur, regardons un autre exemple. Considérez le code suivant :

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
if ($x == $y) {
    echo "相等";
} else {
    echo "不相等";
}

En exécutant le code ci-dessus, nous constaterons que le résultat de sortie n'est "pas égal". En effet, pour la même raison, 0,1 ne peut pas être représenté exactement dans un ordinateur, et $y$ est en fait un nombre légèrement supérieur à 0,7. Ainsi, même si nous nous attendons à ce que les valeurs de $x$ et $y$ soient égales, elles ne le sont pas réellement en raison des limitations de la précision de la virgule flottante.

Pour résoudre ce problème, nous utilisons généralement une plage d'erreur pour les comparaisons en virgule flottante au lieu d'utiliser directement l'opérateur d'égalité. Par exemple, nous pouvons modifier le code ci-dessus comme suit :

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
$epsilon = 0.00001; // 定义一个误差范围

if (abs($x - $y) < $epsilon) {
    echo "相等";
} else {
    echo "不相等";
}

En introduisant une plage d'erreur autorisée, nous pouvons effectuer des comparaisons en virgule flottante de manière plus flexible, évitant ainsi les inégalités causées par des problèmes de précision.

En bref, le phénomène des nombres à virgule flottante inégaux est un problème courant en PHP. En raison de la perte de précision due à la représentation binaire des nombres à virgule flottante, les développeurs doivent faire attention à la gestion de cette situation. En définissant raisonnablement la plage d'erreur ou en adoptant d'autres méthodes de traitement, le problème de la comparaison inégale des nombres à virgule flottante peut être efficacement résolu pour garantir l'exactitude et la stabilité du programme.

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