Ich schreibe gerade ein Projekt zum Thema Finanzen. Es gibt viele Dezimalprobleme. Als ich einmal mit Floor auf zwei Dezimalstellen abrundete, stellte ich plötzlich fest, dass der folgende Code abnormal war.
$money=271.28;
echo $money=floor($money*pow(10,2))/100
Nach dem Login kopieren
Ich war überrascht, dass die Ausgabe nicht 271,28, sondern 271,27 war!
Nachdem ich viele Informationen überprüft hatte, sah ich Folgendes auf der offiziellen PHP-Website:
Gleitkommazahlen haben eine begrenzte Genauigkeit Rationale Zahlen, die in Dezimalschreibweise wie 0,1 oder 0,7 genau dargestellt werden können , Egal wie viele Mantissen es gibt, sie werden nicht genau durch die intern verwendete Binärdatei dargestellt und können daher nicht in das Binärformat konvertiert werden, ohne ein wenig an Präzision zu verlieren. Dies kann zu verwirrenden Ergebnissen führen: Beispielsweise gibt floor((0.1+0.7)*10) normalerweise 7 anstelle von The zurück erwartet 8, da die interne Darstellung des Ergebnisses tatsächlich 7,9999999999999991118... ähnelt. Vertrauen Sie also niemals darauf, dass das Ergebnis einer Gleitkommazahl bis zur letzten Ziffer genau ist, und vergleichen Sie niemals zwei Gleitkommazahlen, um festzustellen, ob sie gleich sind.
Später druckte ich das Ergebnis der obigen Operation aus:
printf("%.12f", $money*pow(10,2));
Nach dem Login kopieren
Das Ergebnis war: 27127.999999999996
Es drehte sich stellt sich als Genauigkeitsproblem heraus. Es wurde noch keine einheitliche Lösung gefunden. Ich kann der Codelogik nur
if ($money - round ( $money, 2 ) < 0.00001) {
}else{
$money=floor($money*pow(10,2))/100;
}
Nach dem Login kopieren
hinzufügen, um eine erneute Verarbeitung der Daten zu vermeiden, die auf zwei Ziffern genau waren.
Wenn jemand eine andere Möglichkeit kennt, die obige Funktion zu implementieren (auf zwei Dezimalstellen genau und die dritte Ziffer weglassen), lassen Sie es mich bitte wissen.
Das Obige stellt das Problem der Bodenfunktion von PHP vor. Ich hoffe, dass es Freunden, die sich für PHP-Tutorials interessieren, hilfreich sein wird, einschließlich relevanter Inhalte.