Bei der Verarbeitung numerischer Werte in PHP, insbesondere bei der Berechnung der schwimmenden Punktzahlen, stoßen Sie häufig auf das Problem der Genauigkeitsabweichung. Dies liegt daran, dass die zugrunde liegende Ebene des Computers binäre schwimmende Punktzahlen verwendet, um sie darzustellen, und einige Dezimalzahlen können nicht genau in binär konvertiert werden, was zu Fehlern während des Berechnungsprozesses führt.
PHP folgt dem IEEE 754-Standard, um Gleitkomma-Zahlen darzustellen, die die Werte in drei Teile aufteilt: Zeichenbits, Exponenten (Bestellcodes) und bedeutende Zahlen (Mansidiaries). Bei der Umwandlung bestimmter Dezimalstellen (z. B. 0,1 oder 0,2) in Binärer tritt häufig eine unendliche Schleife von Dezimalstellen auf, was zu Fehlern führt.
$number = 0.1 + 0.2;
echo $number; // Ausgabe 0.30000000000000004
Im obigen Code sollte die Summe von 0,1 und 0,2 0,3 betragen, aber aufgrund der ungefähren Darstellung der Gleitkomma-Zahlen unten weist das Ausgabeergebnis unerwartete Fehler auf.
$price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total; // Ausgabe 0.80
Obwohl das Ergebnis 0,80 aus der Ausgabe beträgt, können solche kleinen Fehler bei komplexeren Operationen oder Vergleichsoperationen zu logischen Beurteilungsfehlern oder ungenauen Betragsberechnungen führen.
Ein häufiger Trick besteht darin, die schwimmenden Punktzahlen in Ganzzahlen umzuwandeln, um an der Berechnung teilzunehmen, und dann durch die entsprechenden Multiplikatoren nach den Anforderungen zur Wiederherstellung des ursprünglichen numerischen Werts zu teilen. Diese Methode eignet sich für Szenarien, in denen Genauigkeitsfehler in der Finanz- oder Messberechnungen vermieden werden.
$price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total; // Ausgabe 8.0
Diese Methode vermeidet schwimmende Punktfehler, indem die ursprünglichen Multiplikation von 0,8 und 1,0 bis 10 und 8 für die Ganzzahl -Multiplikation umgewandelt wird, und schließlich durch 10 Teilen, um die Genauigkeit wiederherzustellen.
Die integrierte BCMath-Erweiterung von PHP wurde entwickelt, um das Problem der Gleitkomma-Nummerngenauigkeit zu lösen. Es ermöglicht Entwicklern, beliebige Dezimaloperationen mit willkürlicher Genauigkeit im String -Modus auszuführen.
echo bcadd('0.1', '0.2', 1); // Ausgabe 0.3
Die BCADD () -Funktion in BCMath erhält zwei numerische Zeichenfolgen und reservierte Dezimalstellen, wodurch die Ergänzungsvorgänge genau durchgeführt werden und die Probleme mit schwebenden Punkten vollständig vermeiden.
In der tatsächlichen Entwicklung, insbesondere in Geschäftsszenarien wie Finanzen, Inventar und Fraktionsberechnung, ist es wichtig, die Verwendung von PHP -Native -Floating -Punktzahlen für komplexe Berechnungen zu vermeiden. Es wird empfohlen, die BCMATH -Erweiterung in Szenarien zu verwenden, in denen Genauigkeit erforderlich ist, oder um Integer -Conversion -Strategien zu verwenden, um die Zuverlässigkeit des Berechnungsprozesses und der Ergebnisse zu gewährleisten.