Wie kann ich erzwingen, dass die Division in Python Fließkomma ist?
Ich habe zwei Integer-Werte a und b, aber ich brauche ihr Verhältnis in Fließkomma. Ich weiß, dass a < b ist, und ich möchte a/b berechnen. Wenn ich Ganzzahldivision verwende, erhalte ich immer 0 mit einem Rest von a.
Wie kann ich in Python erzwingen, dass c eine Fließkommazahl ist, und zwar wie folgt?
c = a / b
Die eigentliche Frage, die hier gestellt wird, lautet:
"Wie erzwinge ich eine echte Teilung, so dass a / b
einen Bruchteil zurückgeben wird?"
Upgrade auf Python 3
Um in Python 3 eine echte Division zu erhalten, müssen Sie lediglich a / b
.
>>> 1/2
0.5
Die Bodenteilung, das klassische Divisionsverhalten für ganze Zahlen, ist jetzt a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Es kann jedoch sein, dass Sie mit Python 2 nicht weiterkommen, oder dass Sie Code schreiben, 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 Verhalten der Python-3-Division in jedem beliebigen Modul mit dem folgenden Import am Anfang erhalten:
from __future__ import division
die dann die Python-3-ähnliche Aufteilung auf das gesamte Modul anwendet. Es funktioniert auch in einer Python-Shell an jedem beliebigen 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 sie sicherstellt, dass der Code in Ihrem Modul besser mit Python 3 kompatibel ist.
Andere Optionen für Python 2
Wenn Sie dies nicht auf das gesamte Modul anwenden möchten, stehen Ihnen nur einige wenige Umgehungsmöglichkeiten zur Verfügung. Die beliebteste ist, einen der Operanden in einen Float zu verwandeln. Eine robuste Lösung ist a / (b * 1.0)
. In einer neuen Python-Hülle:
>>> 1/(2 * 1.0)
0.5
Ebenfalls robust ist truediv
von der operator
Modul operator.truediv(a, b)
aber das 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 zu sehen ist a / float(b)
. Dies führt zu einem TypeError, wenn b eine komplexe Zahl ist. Da die Division mit komplexen Zahlen definiert ist, halte ich es für sinnvoll, dass die Division nicht fehlschlägt, wenn eine komplexe Zahl als 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
Ich halte es nicht für sehr sinnvoll, den Code absichtlich spröder zu machen.
Sie können Python auch mit dem -Qnew
Flag, aber das hat den Nachteil, dass alle Module mit dem neuen Python 3-Verhalten ausgeführt werden, und einige Ihrer Module könnten eine klassische Division erwarten, daher empfehle ich dies nicht, außer zum Testen. Aber zur Demonstration:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j