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 ?
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 ».
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.
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
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.
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.
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.
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!