Advertisement
  1. Code
  2. PHP

PHP Integers, Floats und Number Strings

by
Read Time:11 minsLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Die Arbeit mit Zahlen in PHP scheint ein triviales Konzept zu sein, kann aber ziemlich verwirrend sein. Es sieht auf den ersten Blick einfach aus, da PHP eine automatische Typkonvertierung bietet. Sie können beispielsweise einer Variablen einen ganzzahligen Wert zuweisen und der Typ dieser Variablen ist eine ganze Zahl. In der nächsten Zeile können Sie derselben Variablen einen String zuweisen und der Typ ändert sich in einen String. Leider kann diese automatische Konvertierung manchmal Ihren Code beschädigen.

Es gibt auch viele Typen für numerische Werte. In diesem Tutorial lernen Sie Integer und Floats in PHP sowie die Funktionen kennen, die verwendet werden können, um die Art der Zahlen, mit denen wir es zu tun haben, zu bestimmen und zwischen ihnen umzuwandeln. Außerdem erfahren Sie, wie Sie Ganzzahlen und Gleitkommazahlen in und aus numerischen Zeichenfolgen konvertieren.

Verschiedene Arten von Zahlen in PHP

Ganzzahlen

Der einfachste Zahlentyp in PHP ist der Integer. Wie Sie vielleicht bereits wissen, sind ganze Zahlen Zahlen ohne Dezimalteil. 2 ist beispielsweise eine ganze Zahl und auch 235298 oder -235298. Auf der anderen Seite sind 2,0 und 3,58 Floats. Wir werden sie später genauer besprechen.

Es ist wichtig, sich daran zu erinnern, dass eine Zahl nicht vom Typ int sein muss, wenn sie keinen Dezimalteil hat. 16 * 2.5 ist beispielsweise genau 40, aber der Typ dieses Ergebnisses ist immer noch ein float. Wenn Sie Zahlen multiplizieren, ist das Endergebnis vom Typ Float, wenn mindestens einer der Operanden ein Float war. Es spielt keine Rolle, ob die letzte Zahl einen Dezimalteil hat oder nicht.

Außerdem kann der maximal mögliche Wert, den eine Ganzzahl in PHP auf Ihrem System haben kann, mit der Konstanten PHP_INT_MAX ermittelt werden. Ein Wert, der größer ist als der von PHP_INT_MAX zurückgegebene Wert, wird als Float gespeichert, auch wenn er wie eine ganze Zahl aussieht.

Im Allgemeinen würden Sie erwarten, dass das Ergebnis der Multiplikation zweier Variablen vom Typ int den Typ int hat. Dies gilt jedoch nicht im Falle eines Überlaufs. Die Multiplikation von fünf oder sechs verschiedenen Zahlen kann Sie leicht über die Grenzen des int-Typs hinausführen. Das Ergebnis von 128*309*32*43*309 ist beispielsweise ein Float auf meinem System, da es den Wert von PHP_INT_MAX überschreitet, der 2147483647 beträgt.

Sie können die Funktion is_int($value) verwenden, um zu überprüfen, ob eine Zahl vom Typ Integer ist. Es gibt zwei Aliase dieser Funktion namens is_integer($value) und is_long($value). Beide werden das gleiche Ergebnis liefern.

Float

Die zweithäufigste Zahlart, mit der Sie sich beschäftigen werden, ist ein Float. Im Gegensatz zu ganzen Zahlen, die in den meisten Fällen einfach Zahlen ohne Dezimalpunkte waren, kann eine Zahl vom Typ float auf verschiedene Weise dargestellt werden. Die Werte 3.14, 12.0, 5.87E+10 und 3.56E-5 sind alle Floats.

PHP konvertiert eine Zahl automatisch in den Typ float, wenn es sich um Dezimalzahlen oder sehr große Zahlen handelt. Der float-Typ kann normalerweise Zahlen mit einer Größe von ungefähr 1.7976931348623E+308 speichern. Dies ist jedoch plattformabhängig.

Der Wert 1.7976931348623E+308 mag wie ein sehr großer Wert erscheinen – und das ist er auch! – aber Gleitkommazahlen haben eine maximale Genauigkeit von nur etwa 14 Stellen. Jede Zahl mit mehr Ziffern verliert ihre Genauigkeit. Das bedeutet, dass Sie eine sehr große Zahl speichern können, aber die Informationen über ihren genauen Wert nicht behalten können – in vielen Fällen ist ein Gleitkommawert nur eine Annäherung.

Es gibt zwei Funktionen, die verwendet werden können, um festzustellen, ob der Wert, mit dem Sie es zu tun haben, ein Float ist. Diese Funktionen sind is_float() und is_double(). Tatsächlich ist is_double() nur ein Alias von is_float(), sodass Sie jeden von ihnen verwenden können und das gleiche Ergebnis erhalten.

Unendlichkeit und NaN

Es gibt zwei weitere Arten von numerischen Werten, mit denen Sie möglicherweise zu tun haben, wenn Sie mathematische Programme schreiben. Diese Werte von Unendlich und NaN (keine Zahl). Beide Werte bedürfen einer kleinen Erklärung, da sie sich von dem unterscheiden, was Sie vielleicht erwarten.

Infinity in PHP unterscheidet sich von Infinity im wirklichen Leben. In PHP wird jeder numerische Wert über ungefähr PHP_FLOAT_MAX auf einer Plattform als unendlich betrachtet. 1.8e308 gibt Ihnen float(INF) auf var_dump(). Sie können mit den Funktionen is_finite() und is_infinite() überprüfen, ob ein numerischer Wert endlich oder unendlich ist.

Ebenso steht NaN für Not a Number, überprüft aber nicht, ob ein Wert numerisch ist oder nicht. Der Wert NaN wird für Ergebnisse mathematischer Operationen verwendet, die in der Mathematik nicht möglich sind. log(-1) ist beispielsweise NaN. Ebenso wird acos(5) auch NaN sein. Sie können überprüfen, ob der von einer mathematischen Operation zurückgegebene Wert keine Zahl ist, indem Sie die Funktion is_nan() verwenden.

Numerische Strings in PHP

So wie PHP den Typ verschiedener Zahlen dynamisch ändert, je nachdem, wie ihre Werte verwendet oder zugewiesen werden, kann es auch den Wert verschiedener numerischer Strings ableiten, damit Sie sie in Zahlen umwandeln können.

Die Funktion is_numeric() kann Ihnen helfen festzustellen, ob ein String oder eine Variable tatsächlich numerisch ist oder nicht. Diese Funktion gibt true für Zahlen zurück, die in oktaler, binärer oder hexadezimaler Schreibweise geschrieben sind. Es wird auch true zurückgegeben, wenn die Zahlen in exponentieller Notation wie +16.52e39 geschrieben sind.

Ab PHP 7.0.0 wird bei der Übergabe eines Strings an is_numeric() nur true zurückgegeben, wenn der String aus einem optionalen Vorzeichen, einigen Ziffern, einer optionalen Dezimalzahl und einem optionalen Exponentialteil besteht. Dies bedeutet, dass ein im hexadezimalen oder binären Format geschriebener numerischer String ab PHP 7.0.0 false zurückgibt.

PHP wandelt bei Bedarf jeden gültigen numerischen String implizit in eine Zahl um. Die folgenden Beispiele sollen Ihnen helfen, diesen Vorgang besser zu verstehen.

Wie Sie sehen, wurden alle gültigen numerischen Zeichenfolgen in ihre jeweiligen Werte umgewandelt, bevor Additionen oder andere Operationen durchgeführt wurden. Der Typ von $num am Ende hängt von seinem Endwert ab.

Im letzten Fall wird der hexadezimale String "0xfedd24" nicht in seinen Dezimalwert umgewandelt, da PHP 7 ihn nicht als gültigen numerischen String ansieht.

Strings und Floats in ganze Zahlen umwandeln

Hin und wieder müssen Sie einen Typ von numerischen Werten in einen anderen umwandeln. PHP hat dafür eine Vielzahl von Funktionen und Techniken. Meistens erfolgt die Konvertierung implizit und Sie müssen sich nicht darum kümmern. Wenn Sie jedoch die hier erwähnten Konvertierungstechniken explizit durchführen müssen, werden Sie definitiv helfen.

Sie können (int) oder (integer) verwenden, um jeden Wert in eine ganze Zahl umzuwandeln. Bei Floats werden die Werte immer gegen Null gerundet. Eine andere Möglichkeit, Strings und Floats in Ganzzahlen umzuwandeln, ist die Funktion intval(). Sowohl (int) als auch intval() funktionieren auf genau die gleiche Weise.

Beachten Sie, dass die Umwandlung von überlaufenden Strings in Ganzzahlen den Endwert auf den maximal zulässigen Ganzzahlwert setzt. Das Umwandeln eines Floats, dessen Wert größer als der maximal zulässige Integer-Wert ist, führt jedoch dazu, dass der Wert zwischen -2147483648 und 2147483647 schwankt!

In bestimmten Situationen müssen Sie möglicherweise mit sehr großen Zahlen umgehen, ohne die Genauigkeit zu verlieren. Beispielsweise ist es unmöglich, mit dem Operator * ein genaues Ergebnis der Multiplikation von 987233498349834828 und 3487197512 zu erhalten. Nach der Float-Konvertierung erhalten Sie 3.4426781992086E+27. Die Berechnung der tatsächlichen Antwort, die 3442678199208600117812547936 lautet, erfordert die Verwendung von Bibliotheken wie BCMath. BCMath funktioniert, indem es Zahlen als Strings speichert und manuell arithmetische Operationen an ihnen durchführt. Denken Sie daran, dass Sie bei der Verwendung von BCMath mit Strings anstelle von Integern und Floats zu tun haben.

Bestimmte Bibliotheken möchten, dass Sie nur Zahlen vom Typ int an ihre Methoden übergeben, aber Sie können ihnen unwissentlich einen Float-Wert übergeben. Dies kann passieren, weil der Wert wie ein Int aussieht, da er keinen Dezimalteil hat. Dies würde mit ziemlicher Sicherheit zu einem Fehler führen, wenn die Bibliothek eine Funktion wie is_int() verwendet, um zu überprüfen, ob die übergebene Zahl vom Integer-Typ ist. In solchen Fällen ist es immer ratsam, diese Zahl zuerst mit (int) oder intval() in int umzuwandeln und sie dann an beliebige Funktionen oder Methoden der Bibliothek zu übergeben.

Ein Beispiel für eine solche Situation wäre, wenn Sie mit mathematischen Funktionen wie floor() und ceil() usw. arbeiten. floor() und ceil() geben immer einen Float zurück, selbst wenn Sie ihnen ein int übergeben!

Ein Problem beim Umwandeln von Gleitkommazahlen in ganze Zahlen besteht darin, dass Sie den Dezimalteil der Zahlen verlieren. Dies kann wünschenswert sein oder auch nicht. In solchen Fällen können Sie Funktionen wie floor() verwenden und die Zahl nur dann in den Typ int umwandeln, wenn ihr tatsächlicher Wert dem von floor() zurückgegebenen Wert entspricht.

Nehmen wir an, Sie haben eine Bibliothek, die Ihnen Brucharithmetik ermöglicht und Ausnahmen auslöst, wenn Sie eine Zahl an die Methode setNumerator() übergeben, die nicht vom Typ int ist. Eine Vielzahl von Operationen kann eine Zahl in den Typ float umwandeln, selbst wenn es sich noch um eine ganze Zahl innerhalb der minimalen und maximalen Grenzen des Typs int handelt. Wenn Sie so etwas wie den obigen Code verwenden, können Sie solche Fälle leicht handhaben.

Abschließende Gedanken

Dieses Tutorial hat verschiedene Möglichkeiten behandelt, wie PHP Zahlen speichert und wie Sie feststellen können, ob es sich um eine Zahl eines bestimmten Typs handelt. Sie können beispielsweise Funktionen wie is_int() und is_float() verwenden, um den Typ einer Zahl zu bestimmen und entsprechend vorzugehen.

Wie Sie im Tutorial gesehen haben, unterstützt PHP die automatische Typkonvertierung. Dies bedeutet, dass manchmal kleinere Ganzzahlen wie 5 oder 476 als Gleitkommazahlen gespeichert worden sein könnten, ohne dass Sie es merken. Die Verwendung dieser Zahlen in Funktionen, die nur int-Werte akzeptieren, kann zu Ausnahmen oder Fehlern führen. Wir haben gelernt, dass eine einfache Lösung für dieses Problem darin besteht, solche Zahlen explizit in int umzuwandeln, wenn sie keinen Dezimalteil haben und sich ihre Werte beim Umwandeln nicht ändern.

Nachdem Sie dieses Tutorial gelesen haben, sollten Sie in der Lage sein, den Typ einer Zahl oder den endgültigen Typ eines Ergebnisses nach einer Vielzahl von Operationen mit vordefinierten Funktionen zu bestimmen und diese nach einigen Prüfungen auch explizit in einen bestimmten Typ umzuwandeln.

Wenn Sie Fragen oder zusätzliche Tipps haben, können Sie wie immer gerne einen Kommentar abgeben.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.