Schauen Sie sich zunächst ein Beispiel an:
<?php$a = 0.1;$b = 0.9;$c = 1; var_dump(($a+$b)==$c); var_dump(($c-$b)==$a);?>
$a+$b==$c gibt wahr zurück, richtig
$c-$b==$a gibt falsch zurück, Fehler
Warum ist das so? Nach der Operation
lautet der tatsächlich zurückgegebene Inhalt bei einer Genauigkeit von 20 Stellen wie folgt:
<?php$a = 0.1;$b = 0.9;$c = 1; printf("%.20f", $a+$b); // 1.00000000000000000000printf("%.20f", $c-$b); // 0.09999999999999997780?>
$c-$b ist 0,0999999999999997780, sodass ein Vergleich mit 0,1 false ergibt
Dieses Problem tritt auf, weil die Berechnung von Gleitkommazahlen Präzision erfordert. Wenn Gleitkommazahlen in Binärzahlen umgewandelt werden, kann die Genauigkeit verloren gehen.
Der ganzzahlige Teil wird durch 2 geteilt und der Rest wird genommen. MethodeDer Dezimalteil wird mit 2 multipliziert. Rundung
Methode
Konvertieren Sie die Zahl 8,5 in eine Binärzahl Der ganzzahlige Teil ist 8
8/2=4 8%2 =0 4/2=2 4%2=0
2/2=1 2%2=0
1 ist kleiner als 2, daher besteht keine Notwendigkeit, es zu berechnen. Das Binärsystem von die ganze Zahl 8 ist
1000
0,5x2 = 1,0 Da der Dezimalteil nach dem Runden 0 ist, gibt es keinen muss noch mehr berechnen
Dezimal 0,5 Das Binärsystem von 0,1
ist 1000,1
Berechnen Sie die Binärsystem der Zahl 0,9 0,9x2= 1,8 0,8x2=1,6
0,6x2=1,2
0,2x2=0,4
0,4x2=0,8
0,8x2= 1.6
…. Dann wird die Schleife fortgesetzt, wenn die Abfanggenauigkeit N beträgt, wird die Zahl nach N abgerundet, was zu einem Genauigkeitsverlust führt.
Im obigen Beispiel geht die Genauigkeit von 0,9 bei der Konvertierung in Binär verloren, was zu Fehlern beim Vergleich führt.
Glauben Sie also niemals, dass eine Gleitkommazahl bis auf die letzte Ziffer genau ist, und vergleichen Sie niemals zwei Gleitkommazahlen auf Gleichheit.
So vergleichen Sie Gleitkommazahlen richtigBeispiel:
<?php$a = 0.1;$b = 0.9;$c = 1; var_dump(($c-$b)==$a); // falsevar_dump(round(($c-$b),1)==round($a,1)); // true?>
2. Verwenden Sie hochpräzise Berechnungsmethoden
Verwenden Sie bei der ersten Berechnung hochpräzise Berechnungsmethoden, um sicherzustellen, dass die Genauigkeit nicht verloren geht.
bcadd
Addiere zwei hochpräzise Zahlen bccomp
Vergleich Die beiden hochpräzisen Zahlen geben -1,0,1 zurück bcp
Zwei hochpräzise Zahlen dividierenbcmod
Ermitteln Sie den Rest einer hochpräzisen Zahlbcmul
Multiplizieren Sie zwei hochpräzise Zahlen bcpow
Ermitteln Sie die Potenz einer hochpräzisen Zahl bcpowmod
Ermitteln Sie die Potenz und den Modul von eine hochpräzise Zahl bcscale
Konfigurieren Sie die Standardanzahl von Dezimalstellen, äquivalent zu „scale=" in Linux bc bcsqrt
Finden Sie die Quadratwurzel einer hochpräzisen Zahl Präzisionszahl bcsub
Kombinieren Sie zwei hochpräzise ZahlensubtraktionenBeispiel:
<?php$a = 0.1;$b = 0.9;$c = 1; var_dump(($c-$b)==$a); // falsevar_dump(bcsub($c, $b, 1)==$a); // true?>
In diesem Artikel wird die PHP-Gleitkommazahlen-Vergleichsmethode erläutert. Weitere verwandte Inhalte finden Sie unter Bitte achten Sie auf die chinesische PHP-Website.
Verwandte Empfehlungen:
Erläuterung der Methode zum Exportieren von Abfrageergebnissen nach CSV über MySQLphp array_push und $arr [] Leistungsvergleich zwischen =$valueSo verwenden Sie PHP, um eine Sitzung einzurichten, die die Ablaufzeit streng kontrolliertDas obige ist der detaillierte Inhalt vonEine Erklärung der PHP-Gleitkommazahlen-Vergleichsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!