Maison > Article > développement back-end > La solution de contournement « de précision » de PHP est-elle fiable pour des calculs monétaires précis à 2 chiffres ?
L'arithmétique à virgule flottante consiste à représenter des nombres fractionnaires sous forme binaire fractions, qui peuvent ne pas avoir de représentations exactes. Cela peut entraîner des erreurs d'arrondi.
Cette solution de contournement peut-elle garantir des calculs précis à 2 chiffres pour l'argent ?
Non. Les paramètres de précision PHP ne peuvent pas garantir des calculs précis à 2 chiffres, car la précision peut être augmentée pendant les calculs.
Exemple d'échec de la solution de contournement :
ini_set('precision', 8); $a = 5.88; // cost of 1kg $q = 2.49; // User buys 2.49 kg $b = $a * 0.01; // 10% Discount only on first kg echo ($a * $q) - $b; // result: 14.5824 (not precise for money calculations)
Quelle valeur php.ini.precision convient le mieux aux calculs monétaires à 2 chiffres ?
La précision PHP est ce n'est pas une mesure recommandée pour des calculs financiers précis.
Utilisation de bcmath, number_format et soustraction :
$a = 342349.23; $b = 341765.07; ini_set('precision', 20); echo $a - $b, PHP_EOL; // 584.15999999997438863 echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding issue) echo number_format($a - $b, 2), PHP_EOL; // 584.16 echo bcsub($a, $b, 2), PHP_EOL; // 584.15 (precision set to 20) ini_set('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 (precision set to 14) ini_set('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 (precision set to 6) ini_set('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 echo bcsub($a, $b, 2), PHP_EOL; // 0.00 (precision set to 3)
Utilisation de number_format pour les calculs monétaires sont recommandés pour des raisons de cohérence. Le stockage en centimes est également une option.
Oui, en raison du grand nombre de combinaisons, un test complet n'est pas pratique.
$a = 0.19; $b = 0.16; ... $h = $a + $b + ...; // Total value: 0.4 $i = $h - $a - $b - ...; // Result: 1.0408341E-17 (expected: 0.00)
Des solutions mathématiques existent, mais cela n'entre pas dans le cadre de cette discussion.
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!