Python / float() / Werte in Gleitkommazahlen umwandeln
Pythons float() wandelt Zahlen und unterstützte Zahlenzeichenketten in Gleitkommazahlen um. Ohne Argument liefert es 0.0, macht aber nicht automatisch aus leerem Text oder None eine Null. Eine erfolgreiche Umwandlung garantiert weder einen endlichen Wert noch die benötigte Dezimalgenauigkeit.
Grundlegende Umwandlung und ursprünglicher Wert
float(value) liefert ein Ergebnis, ohne den Typ der ursprünglichen Variablen zu ändern. Gleitkomma stellt Größen mit endlich vielen Bits dar und kann Brüche nur annähern. Ein sichtbarer Dezimalpunkt ist kein zuverlässiger Test von Typ oder Genauigkeit. Siehe die offizielle float()-Referenz.
Die vollständigen Beispiele benötigen Python 3 und die Standardbibliothek. Speichern Sie sie als UTF-8 in float_example.py und starten Sie python float_example.py oder gegebenenfalls python3. Spätere Beispiele können den Dateiinhalt ersetzen und jeweils eigenständig laufen.
value = 3
converted = float(value)
print(converted, type(converted).__name__)
print(value, type(value).__name__)
print(float(" -2.5 "))
print(float("1e3"))
print(float())
print(float(True))
Erwartete Ausgabe:
3.0 float
3 int
-2.5
1000.0
0.0
1.0
value bleibt eine Ganzzahl. Führende und folgende Leerzeichen, Vorzeichen und Exponentialschreibweisen wie 1e3 werden akzeptiert. True wird zu 1.0; schließen Sie boolesche Werte gesondert aus, wenn Ihre Eingaben sie nicht erlauben.
Eingabeformate, ValueError und TypeError
Gewöhnliche Zahlenzeichenketten verwenden . als Dezimaltrennzeichen. Tausendertrennzeichen, Dezimalkommas und Währungssymbole werden nicht automatisch interpretiert. Falscher Zahlentext führt zu ValueError, ein nicht unterstütztes Objekt wie None zu TypeError.
for value in ("1,234.5", "2,5", "", None):
try:
print(float(value))
except (ValueError, TypeError) as error:
print(type(error).__name__)
ValueError
ValueError
ValueError
TypeError
Blindes Entfernen von Kommas kann aus dem gemeinten Dezimalwert 2,5 die Zahl 25 machen. Legen Sie Format und regionale Regeln zuerst fest und normalisieren Sie nur entsprechend diesen Regeln. Entscheiden Sie, ob eine leere Eingabe ein Fehler oder fehlender Wert ist, statt sie mit echter Null gleichzusetzen.
Warum 0.1 plus 0.2 nicht genau 0.3 ergeben muss
Auf den meisten Systemen werden floats binär gespeichert. Einige Dezimalbrüche sind nicht als endlicher Binärbruch darstellbar und werden angenähert. Das ist eine Darstellungsgrenze, kein Konvertierungsfehler. Das Python-Tutorial zu Gleitkomma erklärt den Hintergrund.
import math
from decimal import Decimal
result = 0.1 + 0.2
print(result)
print(result == 0.3)
print(math.isclose(result, 0.3))
print(Decimal("0.1") + Decimal("0.2"))
0.30000000000000004
False
True
0.3
math.isclose() ermöglicht einen Näherungsvergleich, dessen Toleranzen zu Einheiten und Genauigkeit passen müssen. Nahe null sollten Sie auch abs_tol prüfen. Für genaue Dezimalanforderungen kommt Decimal aus der ursprünglichen Dezimalzeichenkette infrage. Decimal(0.1) beginnt mit einem bereits angenäherten Binärwert.
NaN, Unendlichkeit und Überlauf prüfen
float() akzeptiert nan und inf. NaN bedeutet Not a Number, inf steht für Unendlichkeit. Erfolgreiches Einlesen beweist daher keinen endlichen Messwert. Verwenden Sie bei Bedarf math.isfinite().
import math
for text in ("nan", "inf", "-inf", "2.5"):
number = float(text)
print(text, math.isfinite(number))
nan False
inf False
-inf False
2.5 True
Eine Zeichenkette mit extrem großem Exponenten kann Unendlichkeit liefern; eine riesige Ganzzahl kann bei der Umwandlung OverflowError auslösen. NaN ist außerdem nicht einmal sich selbst gleich. Prüfen Sie es nicht durch x == float("nan"), sondern gezielt mit math.isnan().
print(float("1e400"))
try:
print(float(10 ** 400))
except OverflowError:
print("OverflowError")
print(float("nan") == float("nan"))
inf
OverflowError
False
Nur endliche Zahlen annehmen
Kombinieren Sie die Behandlung von Umwandlungsfehlern mit einer Endlichkeitsprüfung. Die folgende Funktion unterscheidet falsche Eingaben von nicht endlichen Zahlen und gibt nur bei Erfolg einen float zurück. Die englischen Beispielmeldungen können Sie an Ihre Nutzer anpassen.
import math
def finite_number(text):
try:
number = float(text)
except (ValueError, TypeError) as error:
raise ValueError("not a number") from error
if not math.isfinite(number):
raise ValueError("not finite")
return number
for text in ("2.5", "nan", "abc"):
try:
print(finite_number(text))
except ValueError as error:
print(error)
2.5
not finite
not a number
Die Funktion prüft nur Endlichkeit. Für Alter, Mengen oder Verhältnisse können zusätzliche Unter- und Obergrenzen oder Ganzzahligkeit nötig sein. Ersetzen Sie nicht jeden Fehler durch 0.0, denn dadurch würden ungültige Daten und echte Null ununterscheidbar.




