Bei der Computerprogrammierung werden wir immer auf das Problem der Präzision von Gleitkommaoperationen stoßen. Dieser Artikel enthält Beispiele für die Lösung ungenauer Gleitkommaoperationen in PHP Gleitkommaoperationen.
Vergleich der Gleitkommaberechnungsergebnisse
Ein Beispiel für eine Gleitkommaberechnung sieht wie folgt aus:
$a = 0.2+0.7; $b = 0.9; var_dump($a == $b);
Das gedruckte Ergebnis ist: bool(false). Mit anderen Worten, das Berechnungsergebnis von 0,2 + 0,7 entspricht hier nicht 0,9, was offensichtlich unserem gesunden Menschenverstand widerspricht.
Zu diesem Problem hieß es im offiziellen PHP-Handbuch einmal: Offenbar kann ein einfacher Dezimalbruch wie 0,2 nicht in ein internes Binärformat konvertiert werden, ohne ein wenig an Präzision zu verlieren. Dies hat damit zu tun, dass es unmöglich ist, bestimmte Dezimalbrüche exakt mit einer endlichen Anzahl von Stellen auszudrücken. Beispielsweise wird 1/3 in Dezimalzahl zu 0,3333333….
Wir drucken die oben genannten Variablen im Format mit doppelter Genauigkeit aus:
$a = 0.2+0.7; $b = 0.9; printf("%0.20f", $a); echo '<br />'; printf("%0.20f", $b);
Das Ausgabeergebnis lautet wie folgt:
0.89999999999999991118 0.90000000000000002220
Offensichtlich ist hier als Gleitkommadaten ein Teil ihrer Genauigkeit verloren gegangen und sie können nicht vollständig genau sein. Vertrauen Sie also niemals darauf, dass das Ergebnis einer Gleitkommazahl bis zur letzten Ziffer genau ist, und vergleichen Sie niemals zwei Gleitkommazahlen auf Gleichheit. Es ist zu beachten, dass dies kein Problem mit PHP ist, sondern ein Problem mit der computerinternen Verarbeitung von Gleitkommazahlen! Das gleiche Problem tritt in Sprachen wie C und JAVA auf.
Um also zwei Gleitkommazahlen zu vergleichen, müssen wir sie vor dem Vergleich innerhalb des Genauigkeitsbereichs kontrollieren, den wir benötigen. Verwenden Sie daher die Funktion bcadd(), um die Gleitkommazahlen zu addieren und die Genauigkeit (in eine Zeichenfolge) umzuwandeln. :
var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出:bool(true)
Gleitkommazahlenrundung
Im Artikel „PHP-Rundungsfunktion Decke und Boden“ gibt es ein Beispiel:
<?php echo ceil(2.1/0.7); // 输出:4 ?>
Nach der obigen Fläche Diskussion über Gleitkommazahlberechnungen: Wir wissen, dass dies auf die unvollständige Genauigkeit der Ergebnisse der Gleitkommazahlberechnung zurückzuführen ist:
<?php printf("%0.20f", (2.1/0.7)); // 输出:3.00000000000000044409 ?>
Nach der obigen Diskussion wissen wir, dass dies auf die unvollständige Genauigkeit der Ergebnisse der Gleitkommaberechnung zurückzuführen ist. Daher können wir die Funktion „round()“ verwenden, um sie zu verarbeiten:
<?php echo ceil( round((2.1/0.7),1) ); ?>
Die Funktion „round()“ wird zwar entsprechend der angegebenen Genauigkeit ausgeführt. Die Rundung, aber die Beibehaltung einer Dezimalstelle, hat keinen Einfluss auf unser Rundungsergebnis.
Verwandte Empfehlungen:
PHP-Gleitkommazahl-Restmethode
Fragen zur PHP-Gleitkomma-Präzision
PHP-Gleitkomma-Rundungsfunktion_PHP-Tutorial
Das obige ist der detaillierte Inhalt vonTeilen Sie Beispiele für die Lösung ungenauer Gleitkommaberechnungen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!