„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Kann ich mich bei präzisen Geldberechnungen auf die Präzision von PHP „php.ini“ verlassen?

Kann ich mich bei präzisen Geldberechnungen auf die Präzision von PHP „php.ini“ verlassen?

Veröffentlicht am 19.11.2024
Durchsuche:967

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

Kann ich mich auf PHP php.ini Precision Workaround für Gleitkomma-Probleme verlassen?

Einführung

Gleitkomma-Arithmetik, ein komplexes Thema, das oft missverstanden wird, durchdringt moderne Computersysteme. Da es den meisten Bruchzahlen an einer exakten binären Darstellung mangelt, kommt es zwangsläufig zu Rundungen. Das Verständnis der Nuancen von Gleitkommaoperationen ist von entscheidender Bedeutung, wie in „Was jeder Informatiker über Gleitkommaarithmetik wissen sollte“ beschrieben.

Fragen und Antworten


Frage 1: Kann ich den Präzisions-Workaround für präzise zweistellige Berechnungen (z. B. Geld) verwenden?

Antwort: Nein, Sie können sich nicht auf die Präzisionseinstellungen von php.ini verlassen für eine konsistente 2-stellige Genauigkeit, auch für Zahlen unter 10^6, da die Präzisionslänge während der Berechnungen zunehmen kann.

Frage 2: Geben Sie ein klares Beispiel an, wo die Problemumgehung für die Genauigkeit fehlschlägt.

Antwort: Betrachten Sie das folgende Beispiel mit einem Rabatt von 10 % nur auf das erste Kilogramm:

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;

Ausgabe: 14.5824

Frage 3: Welche php.ini .Der Präzisionswert eignet sich für zweistellige Geldberechnungen?

Antwort: PHP-Präzisionseinstellungen sind keine zuverlässige Grundlage für Finanzberechnungen oder Gleitkomma-Präzision. Es ist besser, spezielle Bibliotheken oder Methoden zu verwenden.

Beispielberechnungen

Lassen Sie uns verschiedene Beispiele untersuchen, um die Genauigkeitsbeschränkungen zu veranschaulichen:

$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

Diese Beispiele zeigen die Inkonsistenzen, wenn man sich für genaue Berechnungen auf PHP-Präzisionseinstellungen verlässt.

Schlussfolgerung

Für zuverlässige Finanzberechnungen vergessen Sie es über Gleitkommazahlen und die Verwendung von Cent oder erwägen Sie die Funktion „number_format“ für eine konsistente 2-stellige Genauigkeit.

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;
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3