Heim  >  Artikel  >  php教程  >  Lösungen für ungenaue Gleitkommaberechnungen, Vergleiche und Rundungen in PHP_php-Grundlagen

Lösungen für ungenaue Gleitkommaberechnungen, Vergleiche und Rundungen in PHP_php-Grundlagen

WBOY
WBOYOriginal
2016-05-16 09:00:002129Durchsuche

Vergleich der Ergebnisse der Gleitkommaberechnung
Ein Beispiel für eine Gleitkommaberechnung ist wie folgt:

Code kopieren Der Code lautet wie folgt:

$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 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:

Code kopieren Der Code lautet wie folgt:

$a = 0,2+0,7;
$b = 0,9;
printf("%0.20f", $a);
echo '
';
printf("%0.20f", $b);

Die Ausgabeergebnisse lauten wie folgt:

Code kopieren Der Code lautet wie folgt:

0,89999999999999991118
0,90000000000000002220

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:

Code kopieren Der Code lautet wie folgt:

var_dump(bcadd(0.2,0.7,1) == 0.9); // Ausgabe: bool(true)

Rundung von Gleitkommazahlen

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

Code kopieren Der Code lautet wie folgt:

echo ceil(2.1/0.7); // Ausgabe: 4
?>

Nach der obigen Diskussion über die Berechnung von Gleitkommazahlen wissen wir, dass dies an den ungenauen Ergebnissen der Berechnung von Gleitkommazahlen liegt:

Code kopieren Der Code lautet wie folgt:

printf("%0.20f", (2.1/0.7)); // Ausgabe: 3.0000000000000044409
?>

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:

Code kopieren Der Code lautet wie folgt:

echo ceil( rund((2.1/0.7),1) );
?>

Obwohl die Funktion „round()“ entsprechend der angegebenen Genauigkeit rundet, hat die Beibehaltung einer Dezimalstelle keinen Einfluss auf unser Rundungsergebnis.

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