Typen
PHP Manual

Fließkommazahlen

Fließkommazahlen (auch bekannt als "floats", "doubles" oder "real numbers") können in jeder der folgenden Syntaxformen angegeben werden:

<?php
$a 
1.234;
$b 1.2e3;
$c 7E-10;
?>

Formell:

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

Der Wertebereich für Fließkommawertes ist platformabhängig, alderdings ist ein maximaler Wert von ca. 1.8e308 mit einer Genauigkeit von ca. 14 Nachkommastellen (entsprechend dem 64bit IEEE-Format) üblich.

Warnung

Fließkommagenauigkeit

Fließkommazahlen haben eine begrenzte Präzision. PHP nutzt normalerweise (dies hängt aber vom System ab) das IEEE 754 double precision Format, welches einen maximalen relativen Fehler von 1.11e-16 hat. Nicht elementare Rechenoperationen können einen größeren Fehler verursachen und bei Durchführung von mehreren Operationen können sich die Fehler addieren.

Weiterhin können viele rationale Zahlen, die zwar eine genaue Darstellung zur Basis 10 besitzen, wie beispielsweilse 0.1 oder 0.7, nicht genau als Gleitkommazahl zur intern genutzten Basis 2 dargestellt werden, unabhängig von der Größe der Mantisse. Daher können sie nicht ohne einen gewissen Präzisionsverlust in ihr internes binäres Gegenstück umgewandelt werden können. Dies kann zu verwirrenden Ergebnissen führen, so ergibt floor((0.1+0.7)*10) in der Regel 7 an Stelle der erwarteten 8, da die interne Repräsentation etwa wie folgt aussieht: 8

Sie sollten daher Fließkommawerten nicht bis auf die letzte Nachkommastelle trauen und vor allem niemals Fließkommawerte auf exakte Gleichheit prüfen. Wenn Sie höhere Genauigkeit benötigen können Sie die Mathematikfunktionen für beliebige Genauigkeit oder die gmp-Funktionen nutzen.

Umwandlung in Fließkommawerte

Informationen zur Umwandlung von Strings in float finden Sie im Abschnitt Umwandlung von Zeichenketten in Zahlen. Andere Datentypen werden zunächst in einen integer-Wert umgewandelt und von da aus weiter in einen Fließkommawert. Mehr Informationen hierzu finden Sie im Abschnitt Umwandlung in Integerwerte. Beginnend mit PHP 5 wird bei der Umwandlung eines Objects in float eine Hinweismeldung geworfen.

Comparing floats

As noted in the warning above, testing floating point values for equality is problematic, due to the way that they are represented internally. However, there are ways to make comparisons of floating point values that work around these limitations.

To test floating point values for equality, an upper bound on the relative error due to rounding is used. This value is known as the machine epsilon, or unit roundoff, and is the smallest acceptable difference in calculations.

$a and $b are equal to 5 digits of precision.

<?php
$a 
1.23456789;
$b 1.23456780;
$epsilon 0.00001;

if(
abs($a-$b) < $epsilon) {
    echo 
"true";
}
?>

NaN

Some numeric operations can result in a value represented by the constant NAN. This result represents an undefined or unrepresentable value in floating-point calculations. Any loose or strict comparisons of this value against any other value, including itself, will have a result of FALSE.

Because NAN represents any number of different values, NAN should not be compared to other values, including itself, and instead should be checked for using is_nan().


Typen
PHP Manual