Wie kann ich die Division in Python als Gleitkomma erzwingen?
Ich habe zwei ganzzahlige Werte a und b, aber ich brauche ihr Verhältnis in Gleitkomma. Ich weiß, dass a <b und ich möchte a / b berechnen. Wenn ich also eine ganzzahlige Division verwende, erhalte ich immer 0 mit einem Rest von a.
Wie kann ich im Folgenden erzwingen, dass c in Python eine Gleitkommazahl ist?
c = a / b
Was hier wirklich gefragt wird, ist:
"Wie erzwinge ich eine echte Teilung, a / b
die einen Bruchteil zurückgibt?"
Upgrade auf Python 3
In Python 3 tun Sie dies einfach, um eine echte Teilung zu erzielen a / b
.
>>> 1/2
0.5
Die Bodenteilung, das klassische Teilungsverhalten für ganze Zahlen, lautet nun a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Möglicherweise stecken Sie jedoch mit Python 2 fest, oder Sie schreiben Code, der sowohl in 2 als auch in 3 funktionieren muss.
Bei Verwendung von Python 2
In Python 2 ist das nicht so einfach. Einige Möglichkeiten, mit der klassischen Python 2-Division umzugehen, sind besser und robuster als andere.
Empfehlung für Python 2
Sie können das Python 3-Teilungsverhalten in jedem Modul mit dem folgenden Import oben abrufen:
from __future__ import division
Dadurch wird die Python 3-Stilteilung auf das gesamte Modul angewendet. Es funktioniert auch in einer Python-Shell an einem bestimmten Punkt. In Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Dies ist wirklich die beste Lösung, da dadurch sichergestellt wird, dass der Code in Ihrem Modul vorwärtskompatibler mit Python 3 ist.
Andere Optionen für Python 2
Wenn Sie dies nicht auf das gesamte Modul anwenden möchten, sind Sie auf einige Problemumgehungen beschränkt. Am beliebtesten ist es, einen der Operanden zu einem Float zu zwingen. Eine robuste Lösung ist a / (b * 1.0)
. In einer frischen Python-Shell:
>>> 1/(2 * 1.0)
0.5
Auch robust ist truediv
vom operator
Modul operator.truediv(a, b)
, aber dies ist wahrscheinlich langsamer, weil es ein Funktionsaufruf ist:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Nicht empfohlen für Python 2
Häufig gesehen ist a / float(b)
. Dies löst einen TypeError aus, wenn b eine komplexe Zahl ist. Da die Division mit komplexen Zahlen definiert ist, ist es für mich sinnvoll, dass die Division nicht fehlschlägt, wenn eine komplexe Zahl für den Divisor übergeben wird.
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
Es macht für mich nicht viel Sinn, Ihren Code gezielt brüchiger zu machen.
Sie können Python auch mit dem -Qnew
Flag ausführen. Dies hat jedoch den Nachteil, dass alle Module mit dem neuen Python 3-Verhalten ausgeführt werden. Einige Ihrer Module erwarten möglicherweise eine klassische Aufteilung. Daher empfehle ich dies nur zum Testen. Aber um zu demonstrieren:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j