"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Puis-je compter sur la précision `php.ini` de PHP pour des calculs monétaires précis ?

Puis-je compter sur la précision `php.ini` de PHP pour des calculs monétaires précis ?

Publié le 2024-11-19
Parcourir:104

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

Puis-je compter sur la solution de contournement de précision PHP php.ini pour les problèmes de virgule flottante ?

Introduction

L'arithmétique à virgule flottante, un sujet complexe souvent mal compris, imprègne les systèmes informatiques modernes. Comme la plupart des nombres fractionnaires n’ont pas de représentation binaire exacte, un arrondi se produit inévitablement. Comprendre les nuances des opérations en virgule flottante est crucial, comme indiqué dans « Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante ».

Questions et réponses


Question 1 : Puis-je utiliser la solution de contournement de précision pour des calculs précis à 2 chiffres (par exemple, money) ?

Réponse : Non, vous ne pouvez pas compter sur les paramètres de précision de php.ini pour une précision cohérente à 2 chiffres, même pour les nombres inférieurs à 10^6, car la précision la longueur peut augmenter pendant les calculs.

Question 2 : Fournissez un exemple clair où la solution de contournement de précision échoue.

Réponse : Prenons l'exemple suivant avec une remise de 10 % appliquée uniquement au premier kilogramme :

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

Sortie : 14,5824

Question 3 : Quel php.ini La valeur .precision est-elle adaptée aux calculs monétaires à 2 chiffres ?

Réponse : Les paramètres de précision PHP sont pas une base fiable pour les calculs financiers ou la précision en virgule flottante. Il est préférable d'utiliser des bibliothèques ou des méthodes spécialisées.

Exemples de calcul

Examinons divers exemples pour illustrer les limites de précision :

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

Ces exemples démontrent les incohérences liées au recours aux paramètres de précision PHP pour des calculs précis.

Conclusion

Pour des calculs financiers fiables, oubliez à propos de la virgule flottante et utilisez des cents ou envisagez la fonction number_format pour un résultat cohérent à 2 chiffres précision.

Mise à jour

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3