Zahlen

Bei der Verwendung von Zahlen in Computersystemen sind einige Besonderheiten zu beachten, die in diesem Artikel kurz dargestellt werden. Im Anhang sind Links auf ausführlichere Dokumentationen genannt.

Floats

Gleitkommazahlen haben in EDV-Systemen eine begrenze Genauigkeit und können, bei Anwendern die mit der Problematik nicht vertraut sind, zu unerwarteten Ergebnissen führen. Der folgende Code wird in den meisten Fällen 7 und nicht 8 zurückgeben. Dies hat damit zu tun, das die interne Darstellung im System nicht 8, sondern 7.9999999999999991118.... entspricht. Bei der Verwendung von Gleitkommaarithmetik für die Berechnung von Geldbeträgen, können schnell ein paar Euro fehlen.

$float = floor((0.1+0.7)*10);
echo $float; // 7

Genauigkeit

Die interne Genauigkeit hängt vom System ab und liegt in der Regel bei 14 Stellen. Die gewünschte Genauigkeit kann in PHP über die Konfigurationseinstellung precision eingestellt werden.

precision=14

In den folgenden Beispiel wird eine Gleitkommazahl mit unterschiedlicher Genauigkeit betrachtet. Man sieht recht gut, das eine Erhöhung der Genauigkeit zu Problemen führen kann. Die Gründe hierzu können in dem Wikipedia-Artikel über Gleitkommazahlen nachgelesen werden.

\ini_set('precision', 14);
$float = 24.6;
echo $float; // 24.6

\ini_set('precision', 20);
$float = 24.6;
echo $float; // 24.600000000000001421

Integer

In der folgenden Tabelle sind die Repräsentationen von Ganzzahlen in einem 32bit PHP-System dargestellt. Mann erkennt ganz gut das das erste Bit für das Vorzeichen verwendet wird. Die maximal darstellbare ganzzahlige Zahl hängt von der Systemarchitektur ab und kann über Konstante PHP_INT_MAX abgefragt werden. Die Konstante PHP_INT_SIZE liefert die Anzahl der Bytes, die zur Speicherung der Zahlen verwendet werden.

Darstellung im Zahlenraum

AusgangszahlBinäre DarstellungUmwandlung in Dezimal (bindec)Bemerkung
1073741823001111111111111111111111111111111073741823
1073741824010000000000000000000000000000001073741824Überlauf
2147483647011111111111111111111111111111112147483647entspricht PHP_INT_MAX
-1111111111111111111111111111111114294967295Größte Binärzahl
-100111111111111111111111111100111004294967196
-2147483648100000000000000000000000000000002147483648über ~PHP_INT_MAX

Dieses Wissen ist auch für die Arbeit mit großen Zahlen wichtig. Definiert man zum Beispiel auf einem 64bit System

$int = 9999999999999999999;
echo $int; // 1.0E+19

so definiert man kein Integer, sondern einen Wert vom Typ Float. Verwendet man bei der Zuweisung allerdings eine explizite Typumwandlung (cast), so wird der Wert auf einen Integer “gekürzt”.

$int = (int) 9999999999999999999;
echo $int; // -8446744073709551616 

GMP

Eine Möglichkeit mit sehr großen Zahlen zu arbeiten, bietet die Erweiterung GNU Multiple Precision (gmp). Mit gmp ist es Möglich auch sehr große Werte zu verarbeiten.

$int = gmp_init("9999999999999999999");
$intString = gmp_strval($int);
var_dump($int, $intString); // resource(4) of type (GMP integer)   string(19) "9999999999999999999"