Teilen Sie Beispiele für die Lösung ungenauer Gleitkommaberechnungen in PHP

*文
Freigeben: 2023-03-18 11:28:02
Original
2048 Leute haben es durchsucht

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);
Nach dem Login kopieren

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 &#39;<br />&#39;;
printf("%0.20f", $b);
Nach dem Login kopieren


Das Ausgabeergebnis lautet wie folgt:

0.89999999999999991118
0.90000000000000002220
Nach dem Login kopieren

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)
Nach dem Login kopieren

Gleitkommazahlenrundung

Im Artikel „PHP-Rundungsfunktion Decke und Boden“ gibt es ein Beispiel:

<?php
echo ceil(2.1/0.7);    // 输出:4
?>
Nach dem Login kopieren

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 dem Login kopieren


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) );
?>
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!