Maison >développement back-end >Problème PHP >Parlons des problèmes courants liés à la conversion de nombres à virgule flottante en PHP

Parlons des problèmes courants liés à la conversion de nombres à virgule flottante en PHP

PHPz
PHPzoriginal
2023-03-23 14:10:591539parcourir

Les nombres à virgule flottante jouent un rôle très important dans la programmation et sont nécessaires dans de nombreux domaines, notamment les calculs économiques, l'enregistrement de données, les simulations physiques, etc. Cependant, certains problèmes peuvent survenir lors des calculs en virgule flottante en raison des mécanismes de stockage et de traitement de l'ordinateur. Cet article présentera la conversion de nombres à virgule flottante, les problèmes de précision, les solutions et les meilleures pratiques en PHP.

1. Représentation des nombres à virgule flottante

Dans les ordinateurs, les nombres à virgule flottante sont composés d'un nombre décimal et d'un exposant, et sont généralement exprimés en notation scientifique.

Par exemple : 1,234e+4 signifie 1,234 fois 10 élevé à la puissance quatrième. Ce nombre est divisé en deux parties :

  • Coefficient : 1,234
  • Exposant : 4

En PHP, les nombres à virgule flottante sont représentés au format 64 bits IEEE-754, avec les composantes suivantes :

  1. Bit de signe : Le premier bit représente le positif et le négatif, 0 est un nombre positif et 1 est un nombre négatif.
  2. Bit exposant : les 11 bits du milieu représentent l'exposant, en utilisant la méthode de représentation du code exposant. La plage de valeurs est -1022 ~ 1023, qui est décalée de 1023, donc la valeur dans le codage est la valeur réelle + 1023.
  3. Bits de mantisse : les 52 bits restants représentent la mantisse, en utilisant la notation décimale binaire.

2. Problème de conversion de nombres à virgule flottante en PHP

  1. Une erreur se produit lors de l'exécution d'opérations simples en virgule flottante

En PHP, il n'y a aucun problème pour effectuer des opérations simples d'addition, de soustraction, de multiplication et de division sur une virgule flottante. nombres , mais lors de calculs complexes, des erreurs peuvent facilement survenir.

Par exemple :

$a = 0.1;
$b = 0.2;
$c = $a + $b;
echo $c; //0.3
if ($c == 0.3) {
    echo 'true';
} else {
    echo 'false';
}

Lors de l'exécution de ce code, le résultat est faux. En effet, la façon dont les nombres à virgule flottante sont stockés dans l'ordinateur est différente de la représentation décimale et il existe un problème de précision.

  1. Échec de la conversion d'un nombre à virgule flottante en chaîne

Lors de la conversion d'un nombre à virgule flottante en chaîne, un échec de conversion peut également se produire.

Par exemple :

$val = 0.0000005;
$str = (string)$val;
echo $str; //5.0E-7

Cette chaîne n'est évidemment pas convertie comme prévu. En effet, les nombres à virgule flottante utilisent la notation scientifique, ils sont donc également exprimés en notation scientifique lorsqu'ils sont convertis en chaînes.

3. Solutions de conversion en virgule flottante et meilleures pratiques en PHP

  1. Utilisez des opérateurs de comparaison pour la comparaison

Lors de la comparaison de nombres à virgule flottante, nous ne devons pas utiliser directement l'opérateur d'égalité (==), mais la solution suivante peut être utilisé :

$a = 0.1;
$b = 0.2;
$c = $a + $b;
$epsilon = 0.00001;//可以酌情调整
if(abs($c - 0.3) < $epsilon) {
    echo 'true';
} else {
    echo 'false';
}

Ici, nous définissons une plage d'erreur $epsilon Lorsque la différence entre la valeur absolue du résultat du calcul et le résultat attendu est inférieure à $epsilon, les deux nombres sont jugés égaux.

  1. Utilisez la fonction sprintf pour formater la sortie

Lorsque nous devons convertir des nombres à virgule flottante en chaînes, nous pouvons utiliser la fonction sprintf pour formater la sortie.

Par exemple :

$val = 0.0000005;
$str = sprintf("%.10f", $val);
echo $str; //0.0000005000

%.10f dans la fonction sprintf signifie afficher 10 chiffres après la virgule décimale. La signification originale de %f est "nombre à virgule flottante". Le nombre doit être conservé. Le nombre de décimales.

  1. Utilisez la bibliothèque de fonctions mathématiques BC

Si vous avez besoin de calculs de haute précision, vous pouvez utiliser la bibliothèque de fonctions mathématiques BC. Cette bibliothèque fournit des fonctions prenant en charge les opérations sur les données de haute précision, ce qui peut éviter les erreurs de précision dans les calculs à virgule flottante.

Par exemple :

$a = '0.1';
$b = '0.2';
$c = bcadd($a, $b, 3);
echo $c; //0.300

Cette méthode nécessite que la bibliothèque de fonctions mathématiques BC soit explicitement introduite dans le code, et elle doit également être appelée selon les spécifications des fonctions de la bibliothèque lors de son utilisation.

4. Résumé

Grâce à cet article, nous avons découvert les problèmes courants et les solutions qui peuvent survenir lors de la conversion de nombres à virgule flottante en PHP. Bien qu'il existe des problèmes de précision dans les calculs à virgule flottante sous-jacents de PHP, nous pouvons résoudre ces problèmes grâce à certaines techniques et fonctions de bibliothèque afin de fournir un support de calcul numérique plus fiable pour la mise en œuvre du projet.

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