Heim >Backend-Entwicklung >PHP-Problem >Was soll ich tun, wenn PHP keine Gleitkommazahlen berechnen kann?

Was soll ich tun, wenn PHP keine Gleitkommazahlen berechnen kann?

藏色散人
藏色散人Original
2021-11-19 09:50:161684Durchsuche

php kann keine Gleitkommazahlen berechnen, da die zugrunde liegende Binärdatei des Computers Gleitkommazahlen nicht genau darstellen kann. Die Lösung besteht darin, eine Klassenbibliothek oder Funktionsbibliothek für genaue Berechnungen zu verwenden, wie z. B. die hochpräzise BC-Funktionsbibliothek in PHP.

Was soll ich tun, wenn PHP keine Gleitkommazahlen berechnen kann?

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP-Version 7.1, DELL G3-Computer

Was soll ich tun, wenn PHP keine Gleitkommazahlen berechnen kann?

Probleme bei der Berechnung von Gleitkommazahlen in PHP

Wenn Sie PHPs +-*/ zur Berechnung von Gleitkommazahlen verwenden, kann es zu Problemen mit falschen Berechnungsergebnissen kommen, z. B. echo intval(0.58*100); Drucken Sie 57 anstelle von 58. Dies ist tatsächlich ein Fehler, da die zugrunde liegende Binärdatei des Computers Gleitkommazahlen nicht genau darstellen kann. Dieses Problem ist auch bei der Verwendung von Python aufgetreten. Grundsätzlich bieten die meisten Sprachen Klassenbibliotheken oder Funktionsbibliotheken für präzise Berechnungen. PHP verfügt beispielsweise über eine hochpräzise BC-Funktionsbibliothek.

 Beispiel

<?php    
$f = 0.58;    
var_dump(intval($f * 100)); 
//为啥输出57
?>

 Warum ist die Ausgabe 57? Gibt es einen Fehler in PHP?

 Ich glaube, dass viele Studenten diese Frage hatten, weil es viele Leute gibt, die mir ähnliche Fragen stellen, ganz zu schweigen von bugs.php Fragen Sie im Internet...

Um diesen Grund zu verstehen, müssen wir zunächst die Darstellung von Gleitkommazahlen (IEEE 754) kennen: Gleitkommazahlen werden am Beispiel einer 64-Bit-Länge (doppelte Genauigkeit) verwendet 1 Vorzeichenbit (E), 11 Exponentenbits (Q), 52-Bit-Mantisse (M) repräsentiert (insgesamt 64 Bits).

Vorzeichenbit: Das höchste Bit repräsentiert das Vorzeichen der Daten, 0 repräsentiert eine positive Zahl und 1 stellt eine negative Zahl dar.

 Exponentenbit: stellt die Potenz der Daten zur Basis 2 dar, und der Exponent wird durch einen Offset-Code dargestellt

 Mantisse: stellt die signifikanten Stellen nach dem Dezimalpunkt der Daten dar.

 Der entscheidende Punkt hier ist die Darstellung von Dezimalzahlen im Binärformat, was ist mit Dezimalzahlen? Ausgedrückt im Binärformat, kann ich hier nicht auf Details eingehen. Das Wichtigste, was wir verstehen müssen, ist, dass 0,58 ein unendlich langer Wert ist In den folgenden Zahlen wird die implizite 1 weggelassen.

Die binäre Darstellung von 0,58 ist grundsätzlich (52 Bits): 00101000111101011100001010001111010111000010100011110 Die binäre Darstellung von 0,57 (52 Bits) lautet grundsätzlich: 0010001111010 111000010100011110101 11000010100011110 Und die Binärzahlen der beiden, wenn nur durch berechnet Diese 52 Bits sind: www.111cn.net

0,58 -& gt; Darin (Gleitkomma) werden wir es vage mit Kopfrechnen betrachten ... 0,58 * 100 = Also, dachte ich nicht länger, dass dies ein Fehler in PHP ist, aber das ist es, was es ist ...

Es liegt eine Ungenauigkeit bei +-*%/ in der PHP-Gleitkommaverarbeitung vor

Zum Beispiel:

  $a = 0.1;
  $b = 0.7;
  var_dump(($a + $b) == 0.8);

Der gedruckte Wert ist boolesch falsch

Warum gibt es im PHP-Handbuch die folgende Warnmeldung für Gleitkommazahlen:

Warnung

Gleitkomma-Präzision

Anscheinend können einfache Dezimalbrüche wie 0,1 oder 0,7 nicht in das interne Binärformat umgewandelt werden, ohne ein wenig an Präzision zu verlieren. Dies kann zu verwirrenden Ergebnissen führen: Beispielsweise gibt floor((0.1+0.7)*10) normalerweise 7 statt der erwarteten 8 zurück, da die interne Darstellung des Ergebnisses etwa 7,9999999999… ist.

 Dies hängt damit zusammen, dass es unmöglich ist, bestimmte Dezimalbrüche mit einer endlichen Anzahl von Ziffern genau auszudrücken. Beispielsweise wird 1/3 in Dezimalzahl zu 0,3333333.

Glauben Sie also niemals, dass das Ergebnis der Gleitkommazahl bis zur letzten Ziffer genau ist, und vergleichen Sie niemals, ob zwei Gleitkommazahlen gleich sind. Wenn Sie wirklich eine höhere Präzision benötigen, sollten Sie mathematische Funktionen mit beliebiger Präzision oder GMP-Funktionen verwenden. Der Code lautet wie folgt: Phase Subtraktion, Rest, Multiplikation, n-te Potenz, konfigurieren Sie die Standardanzahl der Dezimalstellen, Quadrat. Diese Funktionen sind nützlicher, wenn es um monetäre Berechnungen geht, beispielsweise bei der Preisberechnung im E-Commerce.

 Hinweis: Bezüglich der Anzahl der eingestellten Ziffern wird der Überschuss verworfen und nicht gerundet.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn PHP keine Gleitkommazahlen berechnen kann?. 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