Der Gleitkommatyp (auch Gleitkommazahl Float, Double Precision Number Double oder Real Number Real genannt) kann mit einer der folgenden Syntaxen definiert werden:
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
Dargestellt in Form einer Gleitkommazahl :
LNUM [0-9]+
DNUM ([0-9]*[.]{LNUM}) | ({LNUM}[.][0-9]*)
EXPONENT_DNUM [+-]?( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Die Wortlänge von Gleitkommazahlen ist plattformabhängig, obwohl das übliche Maximum ist 1,8e308 mit 14 Dezimalstellen Genauigkeit (64-Bit-IEEE-Format).
Warnung
Die Genauigkeit von Gleitkommazahlen
Die Genauigkeit von Gleitkommazahlen ist begrenzt. Obwohl es vom System abhängt, verwendet PHP normalerweise das IEEE 754-Doppelformat, sodass der maximale relative Fehler aufgrund der Rundung 1,11e-16 beträgt. Nicht grundlegende mathematische Operationen können zu größeren Fehlern führen, und die Fehlerfortpflanzung bei der Durchführung zusammengesetzter Operationen muss berücksichtigt werden.
Darüber hinaus können rationale Zahlen wie 0,1 oder 0,7, die unabhängig von der Anzahl der Mantissen genau dezimal dargestellt werden können, durch die intern verwendete Binärzahl nicht genau dargestellt werden und können daher nicht ohne Verlust in Binärzahlen umgewandelt werden ein bisschen Präzision. 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 tatsächlich etwa 7.9999999999999991118... ist.
Vertrauen Sie also niemals darauf, dass das Ergebnis einer Gleitkommazahl bis zur letzten Ziffer genau ist, und vergleichen Sie niemals zwei Gleitkommazahlen, um festzustellen, ob sie gleich sind. Wenn Sie wirklich eine höhere Präzision benötigen, sollten Sie mathematische Funktionen mit beliebiger Präzision oder die GMP-Funktion verwenden.
Eine einfache Erklärung finden Sie auf der Webseite „Floating Point Guide“.
In Gleitkommazahl konvertieren
Wenn Sie Informationen darüber benötigen, wann und wie eine Zeichenfolge in eine Gleitkommazahl konvertiert wird, lesen Sie den Abschnitt „Konvertieren einer Zeichenfolge in einen numerischen Wert“. Bei anderen Werttypen ist die Situation ähnlich wie bei der Konvertierung des Werts in eine Ganzzahl und dann in einen Gleitkommawert. Weitere Informationen finden Sie im Abschnitt „Konvertieren in eine Ganzzahl“. Wenn Sie ab PHP 5 versuchen, ein Objekt in eine Gleitkommazahl umzuwandeln, wird eine E_NOTICE-Fehlermeldung ausgegeben.
Gleitkommazahlen vergleichen
Wie in der obigen Warnmeldung angegeben, besteht aus internen Ausdrucksgründen ein Problem beim Vergleich zweier Gleitkommazahlen auf Gleichheit. Es gibt jedoch Umwege, Gleitkommawerte zu vergleichen.
Um Gleitkommazahlen auf Gleichheit zu testen, verwenden Sie einen minimalen Fehlerwert, der nur einen Punkt größer als dieser Wert ist. Dieser Wert, auch Maschinen-Epsilon oder kleinste Ganzzahleinheit genannt, ist der kleinste Differenzwert, der in der Berechnung akzeptiert werden kann.
$a und $b entsprechen einer Genauigkeit von fünf Dezimalstellen.
<?php $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; } ?>
NaN
Bestimmte mathematische Operationen erzeugen ein Ergebnis, das durch die Konstante NAN dargestellt wird. Dieses Ergebnis stellt einen Wert dar, der in der Gleitkommaarithmetik undefiniert oder nicht darstellbar ist. Das Ergebnis eines losen oder strengen Vergleichs dieses Werts mit einem anderen Wert ist FALSE.
Da NAN einen beliebigen anderen Wert darstellt, sollte NAN nicht mit anderen Werten, einschließlich sich selbst, verglichen und mit is_nan() überprüft werden.