Heim >Backend-Entwicklung >PHP-Tutorial >Problem mit der PHP-Bodenfunktion.

Problem mit der PHP-Bodenfunktion.

WBOY
WBOYOriginal
2016-08-08 09:31:091597Durchsuche



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
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));
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;
}
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.

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
Vorheriger Artikel:Beredte ORM-StudiennotizenNächster Artikel:Beredte ORM-Studiennotizen