Heim  >  Artikel  >  Backend-Entwicklung  >  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?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-06 10:27:02823Durchsuche

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

Kann ich mich auf PHP php.ini Precision Workaround für Gleitkommaprobleme 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


< h3>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 PHP verlassen. ini-Präzisionseinstellungen für 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, bei dem die Problemumgehung für die Präzision 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 <- --- keine präzise 2-stellige Geldberechnung

Frage 3: Welcher php.ini.precision-Wert eignet sich für 2-stellige 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.

Fazit

Für zuverlässige Finanzberechnungen vergessen Sie Gleitkommazahlen und verwenden Sie 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;

Das obige ist der detaillierte Inhalt vonKann ich mich bei präzisen Geldberechnungen auf die Präzision von PHP „php.ini“ verlassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn