Ich habe zwei ganzzahlige Werte a
und b
, aber ich brauche ihr Verhältnis in Gleitkommazahl. ich weiß das a < b
und ich will rechnen a / b
wenn ich also eine ganzzahlige Division verwende, bekomme ich immer 0 mit einem Rest von a
.
Wie kann ich zwingen c
im Folgenden eine Fließkommazahl in Python 2 sein?
c = a / b
In Python 2 erzeugt die Division von zwei Ganzzahlen eine Ganzzahl. In Python 3 erzeugt es einen Float. Wir können das neue Verhalten durch Importieren von erhalten __future__
.
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
Sie können dadurch werfen, um zu schweben c = a / float(b)
. Wenn der Zähler oder Nenner ein Float ist, dann ist das Ergebnis auch.
Eine Einschränkung: Wie Kommentatoren darauf hingewiesen haben, funktioniert dies nicht, wenn b
kann etwas anderes sein als eine ganze Zahl oder eine Fließkommazahl (oder eine Zeichenfolge, die eine solche darstellt). Wenn Sie möglicherweise mit anderen Typen (z. B. komplexen Zahlen) zu tun haben, müssen Sie entweder nach diesen suchen oder eine andere Methode verwenden.
Wie kann ich die Division in Python als Gleitkommazahl erzwingen?
Ich habe zwei ganzzahlige Werte a und b, aber ich brauche ihr Verhältnis in Gleitkommazahl. 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 zwingen, dass c im Folgenden eine Fließkommazahl in Python ist?
c = a / b
Hier wird eigentlich gefragt:
„Wie erzwinge ich so eine wahre Trennung a / b
wird einen Bruchteil zurückgeben?”
Aktualisieren Sie auf Python 3
In Python 3 müssen Sie es einfach tun, um eine echte Division zu erhalten a / b
.
>>> 1/2
0.5
Floor Division, das klassische Divisionsverhalten für ganze Zahlen, ist jetzt verfügbar a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Möglicherweise stecken Sie jedoch bei der Verwendung von Python 2 fest oder schreiben Code, der sowohl in 2 als auch in 3 funktionieren muss.
Bei Verwendung von Python 2
In Python 2 ist es 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 Teilungsverhalten von Python 3 in jedem beliebigen Modul mit dem folgenden Import oben abrufen:
from __future__ import division
die dann die Division im Stil von Python 3 auf das gesamte Modul anwendet. Es funktioniert auch in einer Python-Shell an jedem beliebigen Punkt. In Python2:
>>> 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 aufwärtskompatibel 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 in einen 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
von dem 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 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, macht es für mich Sinn, 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 absichtlich spröder zu machen.
Sie können Python auch mit ausführen -Qnew
-Flag, aber dies hat den Nachteil, dass alle Module mit dem neuen Python 3-Verhalten ausgeführt werden, und einige Ihrer Module erwarten möglicherweise eine klassische Division, 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
In Python 3.x ist der einzelne Schrägstrich (/
) bedeutet immer wahre (nicht abschneidende) Division. (Das //
Operator wird zum Abschneiden der Division verwendet.) In Python 2.x (2.2 und höher) können Sie dasselbe Verhalten erzielen, indem Sie a
from __future__ import division
oben in Ihrem Modul.
Wenn Sie nur einen der Parameter für die Division im Fließkommaformat erstellen, wird auch die Ausgabe im Fließkommaformat erzeugt.
Beispiel:
>>> 4.0/3
1.3333333333333333
oder,
>>> 4 / 3.0
1.3333333333333333
oder,
>>> 4 / float(3)
1.3333333333333333
oder,
>>> float(4) / 3
1.3333333333333333
Fügen Sie einen Punkt hinzu (.
), um Fließkommazahlen anzugeben
>>> 4/3.
1.3333333333333333