Ich habe zwei ganzzahlige Werte a
und b
, aber ich brauche ihr Verhältnis in Gleitkomma. Ich weiß das a < b
und möchte berechnen a / b
. Wenn ich also eine ganzzahlige Division verwende, erhalte ich immer 0 mit einem Rest von a
.
Wie kann ich c
im Folgenden erzwingen , eine Gleitkommazahl in Python zu sein?
c = a / b
python
floating-point
integer
division
python-2.x
Nathan Fellman
quelle
quelle
Antworten:
In Python 2 erzeugt die Division von zwei Ints ein int. In Python 3 wird ein Float erzeugt. Wir können das neue Verhalten durch Importieren aus erhalten
__future__
.quelle
from __future__ import division
ganz am Anfang der Datei sein muss//
wenn Sie eine Bodenteilung wünschen und/
wenn Sie eine "wahre" (float
) Teilung wünschen .Sie können werfen, um zu schweben, indem Sie tun
c = a / float(b)
. Wenn der Zähler oder Nenner ein Float ist, ist das Ergebnis auch.Eine Einschränkung: Wie Kommentatoren hervorgehoben haben, funktioniert dies nicht, wenn es sich
b
möglicherweise nicht um eine Ganzzahl oder eine Gleitkommazahl (oder eine Zeichenfolge, die eine darstellt) handelt. 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.quelle
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
.Die Bodenteilung, das klassische Teilungsverhalten für ganze Zahlen, lautet nun
a // b
: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:
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:
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:Auch robust ist
truediv
vomoperator
Moduloperator.truediv(a, b)
, aber dies ist wahrscheinlich langsamer, weil es ein Funktionsaufruf ist: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.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:quelle
quelle
In Python 3.x bedeutet der einzelne Schrägstrich (
/
) immer eine echte (nicht abschneidende) Teilung. (Der//
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 eingebenoben in Ihrem Modul.
quelle
Wenn Sie nur einen der Parameter für die Division im Gleitkommaformat festlegen, wird auch die Ausgabe im Gleitkommaformat ausgeführt.
Beispiel:
oder,
oder,
oder,
quelle
1.0 + 1/3
oderfloat(c) + a/b
oderfloat(a/b)
und Sie werden von der Antwort enttäuscht sein. Verwenden Sie besser Python 3+ oder importieren Sie das__future__.division
Modul (siehe akzeptierte Antwort), um immer die erwartete Antwort zu erhalten. Die vorhandenen Teilungsregeln verursachen heimtückische, schwer nachvollziehbare mathematische Fehler.python -c 'a=10; b=3.0; print a/b'
?a
und 'b' z. B. die Ausgaben einer Ganzzahlwertfunktion sind? ZB ,a = len(list1), b = len(list2)
.float(..)
. Ich denke, das Multiplizieren mit1.0
, wie @Pinochle unten vorgeschlagen hat, könnte ebenfalls nützlich sein.Fügen Sie einen Punkt (
.
) hinzu, um Gleitkommazahlen anzugebenquelle
float()
für eine der Variablen verwenden.Dies wird auch funktionieren
quelle
a
undb
../
sei ein gültiger Operator in Python, mit dem Sie Gleitkommadivisionen durchführen können. Aus diesem Grund ist es gut, Leerzeichen in jeder Programmiersprache mitWenn Sie standardmäßig die Division "true" (Gleitkomma) verwenden möchten, gibt es ein Befehlszeilenflag:
Es gibt einige Nachteile (aus dem PEP):
Weitere Informationen zu den anderen Flags-Werten, die das Verhalten der Division ändern / warnen, finden Sie in der Python-Manpage.
Ausführliche Informationen zu Abteilungsänderungen finden Sie unter: PEP 238 - Ändern des Abteilungsoperators
quelle
quelle
a
um ein int undb
ein float handelt. Eine bessere Lösung in die gleiche Richtung ist zu tunfrom operator import truediv
und dann zu verwendentruediv(a, b)
.Dabei ist a die Dividende und b der Divisor. Diese Funktion ist praktisch, wenn der Quotient nach der Division zweier Ganzzahlen ein Float ist.
quelle