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

Ausgangszahl Binäre Darstellung Umwandlung in Dezimal (bindec) Bemerkung
1073741823 00111111111111111111111111111111 1073741823
1073741824 01000000000000000000000000000000 1073741824 Überlauf
2147483647 01111111111111111111111111111111 2147483647 entspricht PHP_INT_MAX
-1 11111111111111111111111111111111 4294967295 Größte Binärzahl
-100 11111111111111111111111110011100 4294967196
-2147483648 10000000000000000000000000000000 2147483648 ü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"