Vergleich der Ergebnisse der Gleitkommaberechnung
Ein Beispiel für eine Gleitkommaberechnung ist wie folgt:
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 heißt es im offiziellen PHP-Handbuch einmal: Anscheinend 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:
Die Ausgabeergebnisse lauten wie folgt:
Da es sich um Gleitkommadaten handelt, ist hier offensichtlich 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:
Rundung von Gleitkommazahlen
Im Artikel „PHP-Rundungsfunktionen Decke und Boden“ gibt es ein Beispiel:
Nach der obigen Diskussion über die Berechnung von Gleitkommazahlen wissen wir, dass dies an den ungenauen Ergebnissen der Berechnung von Gleitkommazahlen liegt:
Nach der obigen Diskussion zur Berechnung von Gleitkommazahlen wissen wir, dass dies durch das ungenaue Ergebnis der Berechnung von Gleitkommazahlen verursacht wird, sodass wir die Funktion „round()“ verwenden können, um damit umzugehen:
Obwohl die Funktion „round()“ entsprechend der angegebenen Genauigkeit rundet, hat die Beibehaltung einer Dezimalstelle keinen Einfluss auf unser Rundungsergebnis.