HOWTO · Python

Beheben Sie den TypeError: `float`-Objekt kann in Python nicht als Ganzzahl interpretiert werden

Dieser Artikel zeigt, wie Sie den Python-Fehler „float object cannot be interpreted as an integer“ beheben: Wandeln Sie einen Float vor der Verwendung mit `range()` in eine Ganzzahl um und wählen Sie die Umwandlung passend zur gewünschten Anzahl an Schleifendurchläufen.

Auf dieser Seite

Wenn TypeError: 'float' object cannot be interpreted as an integer erscheint, wird ein Float an eine Stelle übergeben, an der eine Ganzzahl erforderlich ist. Häufig geschieht das, wenn ein Dezimalwert an range() übergeben wird. Wandle den Wert passend zur gewünschten Anzahl an Durchläufen um; die Wahl der Umwandlung verändert die Schleifenanzahl.

Warum range() bei einem Float diesen TypeError auslöst

range() erzeugt eine Folge von Ganzzahlen. Deshalb müssen die Argumente für Start, Ende und Schritt Ganzzahlen oder ganzzahlähnliche Objekte sein, die Pythons Integer-Index-Protokoll implementieren. Ein Float wie 3.0 wird nicht akzeptiert, obwohl sein Nachkommaanteil null ist: Sein Typ ist weiterhin float, nicht int. Beispielsweise löst range(3.5) den Fehler TypeError: 'float' object cannot be interpreted as an integer aus.

Python unterscheidet zwischen Ganzzahlen und Gleitkommazahlen: 3 hat den Typ int, während 3.5 den Typ float hat. Eine Rechenoperation kann einen Float ergeben, obwohl eine spätere Schleife eine ganzzahlige Anzahl benötigt. Der Fehler weist beim Aufruf von range() auf diesen Typkonflikt hin; er bedeutet nicht, dass Python Floats nicht speichern oder damit rechnen kann.

Einen Float vor der Verwendung von range() in eine Ganzzahl umwandeln

Wandle die Anzahl um, bevor du sie an range() übergibst, und wähle die Umwandlung danach aus, wofür die Anzahl steht. Das eingebaute int() funktioniert ohne Import. Es schneidet den Nachkommaanteil in Richtung null ab: int(3.7) ergibt 3 und int(-3.7) ergibt -3. Es rundet nicht auf die nächste Ganzzahl. Wenn der Wert eine Messgröße oder eine berechnete Grenze darstellt, prüfe, ob das Abschneiden zur gewünschten Anzahl an Durchläufen passt.

Die Funktionen math.floor() und math.ceil() sind im Python-Standardmodul math verfügbar. Eine Paketinstallation ist daher nicht nötig; verwende import math. math.floor() gibt die größte Ganzzahl zurück, die kleiner oder gleich dem Eingabewert ist, während math.ceil() die kleinste Ganzzahl zurückgibt, die größer oder gleich dem Eingabewert ist. Für 3.7 ergibt floor 3 und ceil 4; für -3.7 ergibt floor -4 und ceil -3. Dieser Unterschied ist wichtig, wenn die umgewandelte Zahl eine Schleife steuert: Bei einem negativen Wert liegt floor weiter von null entfernt, während int() in Richtung null abschneidet.

Überlege vor der Umwandlung, was der Wert zählt, was ein Teilwert bedeutet und ob die Grenze den letzten unvollständigen Anteil einschließen soll. Für eine Anzahl von Wiederholungsversuchen, Seiten oder Datensätzen kann jeweils eine andere Regel sinnvoll sein. Bewahre die ursprüngliche Messgröße auf, damit bei der Umwandlung keine Genauigkeit verloren geht, die du später noch brauchst. Das kurze Programm unten verwendet eine ausgewählte Ganzzahl als Anzahl für eine gewöhnliche Folge.

Führe das Beispiel aus. In der unveränderten, auswählbaren Ausgabe stehen int: 3 und ceil: 4; die Bezeichnungen int: und ceil: bleiben auf Englisch.

import math

count = 3.7
truncated = int(count)
rounded_up = math.ceil(count)
print("int:", truncated)
print("ceil:", rounded_up)
for index in range(truncated):
    print(index)
int: 3
ceil: 4
0
1
2

Die Ausgabe zeigt int: 3 und ceil: 4; diese Bezeichnungen bleiben im unveränderten Beispiel auf Englisch. Anschließend gibt die Schleife die Werte 0, 1 und 2 aus.

Je nach gewünschtem Ergebnis int(), math.floor() oder math.ceil() wählen

Verwende int(), wenn der Nachkommaanteil wie beabsichtigt in Richtung null abgeschnitten werden soll. Verwende math.floor(), wenn die Anzahl den ursprünglichen Wert nicht überschreiten darf, und math.ceil(), wenn sie mindestens so groß wie der ursprüngliche Wert sein muss. Bei positiven Eingaben liefern int() und math.floor() dasselbe Ergebnis; bei negativen Nicht-Ganzzahlen unterscheiden sie sich. Keine dieser Möglichkeiten ist immer richtig: Berücksichtige, ob der Float eine Dauer, eine zu verarbeitende Menge oder eine Grenze darstellt, und wähle die Regel, die zur gewünschten Anzahl passt.

Bei einem endlichen Float liefern alle drei Umwandlungen eine Ganzzahl, die sich für range() eignet. Dabei geht jedoch der Nachkommaanteil verloren. Bewahre deshalb den ursprünglichen Float gesondert auf, wenn spätere Berechnungen ihn noch benötigen. Soll der Wert eigentlich bereits eine ganzzahlige Anzahl sein, ist es möglicherweise besser, seine Quelle zu korrigieren oder ihn vor der Umwandlung zu prüfen, statt die Anzahl stillschweigend zu verändern.

Den umgewandelten Wert und die Schleifenausgabe prüfen

Prüfe sowohl die umgewandelte Anzahl als auch die von der Schleife ausgegebenen Werte. range(n) beginnt bei 0, erhöht den Wert jeweils um 1 und endet vor n. Bei einer Anzahl von 3 entstehen daher die Werte 0, 1 und 2, also drei Durchläufe. Bei einer Anzahl von 0 gibt es keine Durchläufe. Auch ein negativer Endwert erzeugt mit dem standardmäßigen positiven Schritt keine Werte. An diesem Verhalten erkennst du, ob die Umwandlung verändert hat, welche Arbeit dein Programm ausführt.

Im Beispiel machen die ausgegebene Anzahl und die Schleifenwerte sichtbar, welche Wirkung das Abschneiden von 3.7 hat. Die Bezeichnungen int: und ceil: in der unveränderten Ausgabe bleiben auf Englisch; zu sehen sind int: 3, ceil: 4 sowie die Schleifenwerte 0, 1 und 2. Um einen anderen Eingabewert zu prüfen, ersetze count und vergleiche das Umwandlungsergebnis mit der gewünschten Regel. Bei einem negativen Wert kannst du int(count), math.floor(count) und math.ceil(count) vergleichen, bevor du einen davon als Endwert verwendest. Richtig ist die Umwandlung, deren Ergebnis der gewünschten Anzahl an Durchläufen entspricht – nicht einfach irgendeine Umwandlung, durch die der TypeError verschwindet.