Heim  >  Artikel  >  Backend-Entwicklung  >  Wie vergleiche ich Gleitkommazahlen in PHP?

Wie vergleiche ich Gleitkommazahlen in PHP?

怪我咯
怪我咯Original
2017-07-11 13:58:494098Durchsuche

Gleitkommazahlen weisen während des Konvertierungsprozesses Fehler auf, sodass Gleitkommazahlen im Allgemeinen nicht direkt verglichen werden können, wenn die Differenz zwischen den beiden Zahlen innerhalb liegt einen akzeptablen Bereich, dann betrachten wir die beiden Gleitkommazahlen als gleich. In diesem Artikel wird hauptsächlich die Vergleichsmethode php für Gleitkommazahlen vorgestellt, die einen guten Referenzwert hat. Werfen wir einen Blick darauf mit dem Editor unten

Das Problem der Genauigkeit von Gleitkommaoperationen

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, richtig zurück
$c-$b==$a gibt falsch, falsch zurück

Warum ist das so?

Nach dem Vorgang 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.00000000000000000000
printf("%.20f", $c-$b); // 0.09999999999999997780
?>

$c-$b ist 0,09999999999999997780, also mit 0,1 vergleichen und false zurückgeben

Dieses Problem tritt auf, weil die Berechnung von Gleitkommazahlen Präzision erfordert. Wenn Gleitkommazahlen in Binärzahlen umgewandelt werden, kann die Genauigkeit verloren gehen.

Umrechnungsmethode von Gleitkommazahlen in Binärzahlen

Der ganzzahlige -Teil übernimmt die Division durch 2, um den Rest Methode

Der Dezimalteil wird mit der

multipliziert mit 2 Methode

gerundet. Zum Beispiel: Wandeln Sie die Zahl 8,5 in eine Binärzahl um

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. Die Binärzahl System der ganzen Zahl 8 ist

1000

Der Dezimalteil ist 0,5

0,5x2 = 1,0

Da der Dezimalteil nach dem Runden 0 ist, ist keine weitere Berechnung erforderlich

Das Binärsystem der Dezimalzahl 0,5 ist 0,1

8,5 Das Binärsystem von ist 1000,1

Berechne die Zahl 0,9 Binär

0,9x2=1,8

0,8x2=1,6
0,6x2=1,2
0,2x2=0,4
0,4x2=0,8
0,8x2 =1,6

… Danach wird die

Schleife fortgesetzt Ist N, wird die Zahl nach N gerundet, 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 anschließenden Vergleichen die Rundungsmethode >Beispiel:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);          // false
var_dump(round(($c-$b),1)==round($a,1)); // true
?>

2. Verwenden Sie hochpräzise BerechnungsmethodenBei der Durchführung von Berechnungen Verwenden Sie zunächst hochpräzise Berechnungsmethoden. Präzisionsberechnungsmethoden, um sicherzustellen, dass die Präzision nicht verloren geht.

Die hochpräzise Betriebsmethode ist wie folgt:

bcadd Konvertieren Sie zwei hochpräzise Zahlen Add

bccomp Vergleicht zwei hochpräzise Zahlen und gibt -1,0,1

zurück bcpDividiere zwei hochpräzise Zahlen

bcmodErmittle den Rest einer hochpräzisen Zahl

bcmulMultiplizieren Sie zwei hochpräzise Zahlen

bcpowErmitteln Sie die Potenz einer hochpräzisen Zahl

bcpowmodErmitteln Sie den Modul der Potenz hochpräziser Zahlen

bcscaleKonfigurieren Sie die Standardanzahl der Dezimalstellen , was Linux in bc ”scale=”

bcsqrt entspricht. Finden Sie die Quadratwurzel einer hochpräzisen Zahl

bcsub Kombinieren Sie zwei hochpräzise digitale Subtraktion Beispiel:

Das obige ist der detaillierte Inhalt vonWie vergleiche ich Gleitkommazahlen in PHP?. 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