Maison >développement back-end >tutoriel php >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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 10:27:02893parcourir

 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 un problème 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


< h3>Question 1 : Puis-je utiliser la solution de contournement de précision pour des calculs précis à 2 chiffres (par exemple, de l'argent) ?

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

Question 2 : Fournissez un exemple clair d'échec de la solution de contournement de précision.

Réponse : Considérons 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 <- --- pas un calcul précis à 2 chiffres

Question 3 : Quelle valeur php.ini.precision convient aux calculs monétaires à 2 chiffres ?

Réponse : Les paramètres de précision PHP ne constituent 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 la virgule flottante et utilisez des centimes ou pensez à la fonction number_format pour une précision constante à 2 chiffres.

Update

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;

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