Der Divisionsoperator (/) in Python 2.x hat, abhängig von seinen Argumenten, unterschiedliche Bedeutung: Teilt man (Long) Integer, erhält man das abgerundete Ergebnis, bei Gleitkomma- (Float) oder komplexen Zahlen eine genügend präzise Annäherung. Erwartet man beispielsweise Float, verwendet aber selbst oder durch Eingabe Integer, kann das zu unerwartenden Verhalten führen:

[elippmann@ws-elippmann ~]$ python
Python 2.7.3 (default, Jul 24 2012, 10:05:38)
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a, b = 5, 10
>>> a / b

Wenn als Eingabe verschiedene numerische Datentypen erlaubt sind, müssen wir bei der Berechnung sicherstellen, dass das Ergebnis eine Gleitkommazahl ist:

>>> float(a) / b
0.5

Komplexe Zahlen, können mit dieser Methode aber nicht verarbeitet werden:

>>> c = 4j
>>> float(c) / b
Traceback (most recent call last):
File "", line 1, in
TypeError: can't convert complex to float

Um Vorzeichen beizubehalten und alle numerischen Datentypen verabeiten zu können, ist nur die Multiplikation mit 1.0 richtig:

>>> c * 1.0 / b
0.4j

In Python 3 ist das alles nicht mehr nötig, da Ergebnisse automatisch Gleitkommazahlen sind. Ab Python 2.2 kann dieses Verhalten aktiviert werden, indem das entsprechende Feature aus dem __future__-Modul aktiviert wird:

>>> from __future__ import division
>>> a / b
0.5
>>> c / b
0.4j

Zum Abschluss noch ein Hinweis: Wer wirklich Integer-Division verwenden möchte, sollte auch den entsprechneden Operator benutzen, ehe nach Konvertierung des Code zu Python 3, böse Überraschungen warten:

>>> a // b
>>> float(a) // b
0.0
>>> c // b
0j

Zum Weiterlesen:

Eric Lippmann
Eric Lippmann
Lead Senior Developer

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er sich für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.