Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte grafische Erläuterung der PHP-Gleitkommazahlen-Vergleichsmethode

Detaillierte grafische Erläuterung der PHP-Gleitkommazahlen-Vergleichsmethode

墨辰丷
墨辰丷Original
2018-05-22 16:34:231214Durchsuche

In diesem Artikel wird hauptsächlich die Vergleichsmethode für PHP-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, Fehler zurück

Warum passiert das?

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


Umrechnungsmethode für Gleitkommazahlen

Der ganzzahlige Teil wird durch

durch 2 geteilt, um den Rest zu erhaltenMethode

Der Dezimalteil wird mit der Methode multipliziert mit 2 gerundet

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=01 ist kleiner als 2, daher besteht keine Notwendigkeit, es zu berechnen. Das Binärsystem der ganzen Zahl 8 ist

1000



Der Dezimalteil ist 0,5

0,5x2 = 1,0Weil der Dezimalteil danach 0 ist Rundung, keine Berechnung mehr nötigDezimal Das Binärsystem von 0,5 ist 0,1 >

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 , 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 zur letzten Ziffer genau ist, und vergleichen Sie niemals zwei Gleitkommazahlen auf Gleichheit.

So vergleichen Sie Gleitkommazahlen richtig




1. Verwenden Sie die Rundungsmethode, um zu verarbeiten und dann zu vergleichen

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 einen hochpräzisen Betrieb Methoden

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

Konvertieren Sie zwei hochpräzise Zahlen Addierenbccomp

Vergleicht zwei hochpräzise Zahlen und gibt -1,0,1 zurück

bcpDividieren Sie zwei hochpräzise Zahlen

bcmodErmitteln Sie 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 äquivalent zu „scale="

bcsqrt Finden Sie die Quadratwurzel einer hochpräzisen Zahl

bcsub Subtrahiere zwei hochpräzise Zahlen

Beispiel:

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

Verwandte Empfehlungen:

Detaillierte Erklärung von JSGleitkommazahlOperationsverarbeitung (grafisches Tutorial)

Javascript-Implementierung zum Finden der Quadratwurzel von
Gleitkommazahlen



Teilen von Beispielen für die Lösung ungenauer

Gleitkommazahlen

in PHP


Das obige ist der detaillierte Inhalt vonDetaillierte grafische Erläuterung 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