En programmation PHP, vous pouvez rencontrer le problème de calculs en virgule flottante inexacts. Comprendre la cause et la solution de ce problème peut améliorer la fiabilité et la précision de votre code.
1. Cause du problème
Les nombres à virgule flottante sont un moyen très pratique de représenter les nombres à virgule flottante, mais ils présentent également quelques inconvénients. La raison principale est que les ordinateurs utilisent le binaire pour stocker les nombres et ne peuvent pas représenter avec précision tous les nombres à virgule flottante. Cela entraîne des erreurs d’arrondi et une perte de précision.
Par exemple, imaginez un simple calcul en virgule flottante :
0.1 + 0.2 = 0.3
En PHP, le résultat de ce code est le suivant :
echo 0.1 + 0.2; //0.30000000000000004
Évidemment, ce résultat n'est pas celui auquel nous nous attendions. En effet, 0,1 et 0,2 ne peuvent pas être représentés avec précision sous forme de nombres binaires, ce qui entraîne des erreurs d'arrondi. Bien que cette erreur soit généralement faible, elle suffit à entraîner une perte de précision ou à créer des erreurs dans certains calculs de haute précision.
2. Solution
Pour le problème des calculs à virgule flottante inexacts, nous pouvons adopter les solutions suivantes :
Lorsque vous effectuez des calculs précis, vous pouvez d'abord convertir des nombres à virgule flottante en nombres entiers, puis effectuer calculs. Une fois le calcul terminé, le résultat est reconverti en nombre à virgule flottante.
Par exemple, considérons le calcul en virgule flottante suivant :
1.23 + 4.56 = 5.79
Les nombres à virgule flottante peuvent être convertis en nombres entiers pour le calcul :
$num1 = 123; $num2 = 456; $result = ($num1 + $num2) / 100; // 5.79
PHP fournit une extension BCMath qui peut être utilisée pour calculer avec précision des nombres de précision arbitraires . Les calculs à virgule flottante peuvent être effectués à l'aide de la bibliothèque BCMath, qui utilise des chaînes pour représenter des nombres au lieu de nombres à virgule flottante.
Par exemple, en utilisant la bibliothèque de fonctions BCMath pour calculer :
$val1 = '0.1'; $val2 = '0.2'; echo bcadd($val1, $val2, 1); // 0.3
Dans cet exemple, nous utilisons la fonction bcadd() pour effectuer une addition exacte en virgule flottante.
Dans certains cas, la fonction round() peut être utilisée pour réduire l'erreur de précision. La fonction round() arrondit un nombre à virgule flottante à un nombre spécifié de décimales.
Par exemple, considérons le calcul suivant :
$num1 = 0.1; $num2 = 0.2; $result = round($num1 + $num2, 1); // 0.3
Cet exemple utilise la fonction round() pour arrondir le résultat à une décimale. Bien que cela n’élimine pas complètement l’erreur de précision, les résultats sont beaucoup plus proches de ce qui était attendu.
Lors de la comparaison de nombres à virgule flottante, un mécanisme de tolérance aux pannes doit être utilisé. Étant donné que la précision des nombres à virgule flottante peut souffrir d'erreurs d'arrondi, il n'est généralement pas fiable de comparer directement les valeurs de deux nombres à virgule flottante.
Par exemple, considérons la comparaison à virgule flottante suivante :
$val1 = 3.14159265; $val2 = 3.14159267; if ($val1 == $val2) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
Dans cet exemple, nous comparons deux nombres à virgule flottante. Bien que ces deux chiffres soient proches, ils ne sont pas égaux. Par conséquent, le code affiche "val1 n'est pas égal à val2".
Si vous devez comparer deux nombres à virgule flottante, vous pouvez utiliser une valeur de tolérance ou une valeur delta. Une valeur de tolérance est un petit nombre qui peut tolérer une petite erreur dans un nombre à virgule flottante.
Par exemple, nous pouvons définir une valeur delta, qui représente l'erreur de précision maximale autorisée :
$delta = 0.00000001;
Avec la valeur delta, nous pouvons utiliser le code suivant pour comparer des nombres à virgule flottante :
$val1 = 3.14159265; $val2 = 3.14159267; if (abs($val1 - $val2) < $delta) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
Dans cet exemple, nous utilisons le Fonction abs() Calculez la différence entre deux nombres à virgule flottante et comparez-la avec la valeur delta. Si la différence entre deux nombres est inférieure à la valeur delta, ils sont considérés comme égaux.
En bref, le problème des calculs en virgule flottante inexacts est un problème courant. En PHP, ce problème peut être résolu en utilisant des méthodes telles que l'arithmétique entière, la bibliothèque de fonctions BCMath, la fonction round() et la tolérance des valeurs delta. Selon la situation, différentes solutions peuvent être choisies.
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!