Pourquoi le calcul de la virgule flottante PHP est-il inexact ?

PHPz
Libérer: 2023-04-23 14:12:13
original
1715 Les gens l'ont consulté

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

En PHP, le résultat de ce code est le suivant :

echo 0.1 + 0.2; //0.30000000000000004
Copier après la connexion

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

  1. Utiliser des calculs entiers

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

Les nombres à virgule flottante peuvent être convertis en nombres entiers pour le calcul :

$num1 = 123;
$num2 = 456;

$result = ($num1 + $num2) / 100; // 5.79
Copier après la connexion
  1. Utilisation de BCMath

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

Dans cet exemple, nous utilisons la fonction bcadd() pour effectuer une addition exacte en virgule flottante.

  1. Utilisez la fonction round()

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

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.

  1. Évitez la comparaison directe de nombres à virgule flottante

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

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

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

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!

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