Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Erklärung der PHP-Gleitkommazahlen-Vergleichsmethode

Eine Erklärung der PHP-Gleitkommazahlen-Vergleichsmethode

jacklove
jackloveOriginal
2018-06-09 10:32:341450Durchsuche

Problem mit der Genauigkeit der Gleitkommaoperation

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.

Methode zur Konvertierung von Gleitkommazahlen

Der ganzzahlige Teil wird durch 2 geteilt und der Rest wird genommen. MethodeDer Dezimalteil wird mit 2 multipliziert. Rundung
Methode

Zum Beispiel:

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

Der Dezimalteil ist 0,5

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

8,5 Das Binärsystem von

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 richtig

1. Verwenden Sie zum Verarbeiten und Vergleichen

Beispiel:

<?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.

Die hochpräzise Betriebsmethode ist wie folgt:

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 MySQL


php array_push und $arr [] Leistungsvergleich zwischen =$value


So verwenden Sie PHP, um eine Sitzung einzurichten, die die Ablaufzeit streng kontrolliert

Das 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!

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