Lors du traitement des valeurs numériques dans PHP, en particulier lors du calcul des nombres de points flottants, vous rencontrez souvent le problème de la déviation de précision. En effet, la couche sous-jacente de l'ordinateur utilise des nombres de points flottants binaires pour les représenter, et certains nombres décimaux ne peuvent pas être convertis avec précision en binaire, entraînant des erreurs pendant le processus de calcul.
PHP suit la norme IEEE 754 pour représenter les nombres à virgule flottante, qui divise les valeurs en trois parties: bits de signe, exposants (codes de commande) et nombres significatifs (mansiaires). Lors de la conversion de certaines décimales (telles que 0,1 ou 0,2) en binaire, une boucle infinie de décimales se produit souvent, provoquant des erreurs.
$number = 0.1 + 0.2;
echo $number; // Sortir 0.30000000000000004
Dans le code ci-dessus, la somme de 0,1 et 0,2 devrait être de 0,3, mais en raison de la représentation approximative des nombres à virgule flottante en bas, le résultat de sortie a des erreurs inattendues.
$price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total; // Sortir 0.80
Bien que le résultat soit de 0,80 par rapport à la sortie, dans des opérations plus complexes ou des opérations de comparaison, ces petites erreurs peuvent entraîner des erreurs de jugement logiques ou des calculs de montant inexacts.
Une astuce commune consiste à convertir les nombres de points flottants en entiers pour participer au calcul, puis à diviser par les multiples correspondants en fonction des exigences pour les restaurer à la valeur numérique d'origine. Cette méthode convient aux scénarios où les erreurs de précision sont évitées dans les calculs financiers ou de l'unité de mesure.
$price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total; // Sortir 8.0
Cette méthode évite les erreurs de points flottants en convertissant les 0,8 et 1,0 d'origine à 10 et 8 pour la multiplication entière, et enfin en divisant par 10 pour restaurer la précision.
L'extension BCMATH intégrée de PHP est conçue pour résoudre le problème de précision du nombre de points flottants. Il permet aux développeurs d'effectuer des opérations décimales arbitraires avec une précision arbitraire en mode chaîne.
echo bcadd('0.1', '0.2', 1); // Sortir 0.3
La fonction BCADD () dans BCMATH reçoit deux chaînes numériques et des décimales réservées, effectuant ainsi les opérations d'addition avec précision, en évitant complètement les problèmes d'erreur de point flottant.
Dans le développement réel, en particulier dans les scénarios commerciaux tels que la finance, l'inventaire et le calcul de la fraction, il est important d'éviter d'utiliser des nombres de points flottants natifs de PHP pour des calculs complexes. Il est recommandé d'utiliser une extension BCMath dans des scénarios où une précision est requise ou d'utiliser des stratégies de conversion entière pour assurer la fiabilité du processus de calcul et des résultats.