it-swarm.com.de

Wie kann ich die Division als Gleitkomma erzwingen? Division rundet weiter auf 0?

Ich habe zwei ganzzahlige Werte a und b, aber ich brauche ihr Verhältnis in Gleitkomma. Ich weiß, dass a < b und ich a / b berechnen möchte. Wenn ich also die Ganzzahldivision verwende, erhalte ich immer 0 mit einem Rest von a.

Wie kann ich c zwingen, eine Gleitkommazahl in Python zu sein?

c = a / b
698
Nathan Fellman

In Python 2 ergibt die Division von zwei Ints ein int. In Python 3 wird ein Float erzeugt. Wir können das neue Verhalten durch Importieren von __future__ erhalten.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
784
Michael Fairley

Sie können schweben lassen, indem Sie c = a / float(b) ausführen. Wenn der Zähler oder Nenner ein Float ist, ist das Ergebnis ebenfalls.


Eine Einschränkung: Wie die Kommentatoren hervorgehoben haben, funktioniert dies nicht, wenn b eine andere Zahl als eine Ganzzahl oder eine Gleitkommazahl (oder eine Zeichenfolge, die eine darstellt) ist. Wenn Sie sich möglicherweise mit anderen Typen (wie komplexen Zahlen) befassen, müssen Sie diese entweder überprüfen oder eine andere Methode anwenden.

704
Steve Trout

Wie kann ich in Python die Division 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 a/b berechnen möchten. Wenn ich also eine Ganzzahldivision verwende, erhalte ich immer 0 mit einem Rest von a.

Wie kann ich im Folgenden erzwingen, dass c eine Gleitkommazahl in Python ist?

c = a / b

Was hier wirklich gefragt wird, ist:

"Wie erzwinge ich eine echte Teilung, sodass a / b einen Bruchteil zurückgibt?"

Aktualisieren Sie auf Python 3

In Python 3 führen Sie einfach a / b aus, um eine echte Unterteilung zu erhalten.

>>> 1/2
0.5

Floor Division, das klassische Unterteilungsverhalten für ganze Zahlen, ist jetzt 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 es nicht so einfach. Einige Arten des Umgangs mit der klassischen Python 2-Division sind besser und robuster als andere.

Empfehlung für Python 2

Sie können das Unterteilungsverhalten von Python 3 in einem beliebigen Modul mit dem folgenden Import oben abrufen:

from __future__ import division

dies wendet dann die Stilunterteilung Python 3 auf das gesamte Modul an. 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 sichergestellt wird, dass der Code in Ihrem Modul mit Python 3 vorwärtskompatibler 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 neuen Python Shell:

>>> 1/(2 * 1.0)
0.5

Ebenfalls robust ist truediv aus dem operator -Modul operator.truediv(a, b), aber dies ist wahrscheinlich langsamer, da es sich um einen Funktionsaufruf handelt:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

Nicht empfohlen für Python 2

Häufig gesehen wird a / float(b). Dies löst einen TypeError aus, wenn b eine komplexe Zahl ist. Da eine Division mit komplexen Zahlen definiert ist, ist es für mich sinnvoll, keine Division fehlschlagen zu lassen, 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 wenig Sinn, Ihren Code gezielt spröder zu machen.

Sie können Python auch mit dem Flag -Qnew ausführen. Dies hat jedoch den Nachteil, dass alle Module mit dem neuen Verhalten Python 3 ausgeführt werden 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
188
Aaron Hall
c = a / (b * 1.0)
133
Pinochle

In Python 3.x bedeutet der einfache Schrägstrich (/) immer echte (nicht abschneidende) Division. (Der // -Operator wird zum Abschneiden von Divisionen verwendet.) In Python 2.x (2.2 und höher) können Sie dasselbe Verhalten erzielen, indem Sie ein setzen

from __future__ import division

am oberen Rand Ihres Moduls.

66
newacct

Wenn Sie nur einen der Parameter für die Division im Gleitkommaformat festlegen, wird auch die Ausgabe im Gleitkommaformat erstellt.

Beispiel:

>>> 4.0/3
1.3333333333333333

oder,

>>> 4 / 3.0
1.3333333333333333

oder,

>>> 4 / float(3)
1.3333333333333333

oder,

>>> float(4) / 3
1.3333333333333333
30
gsbabil

Fügen Sie einen Punkt (.) hinzu, um Gleitkommazahlen anzugeben

>>> 4/3.
1.3333333333333333
20
Alexander

Das wird auch funktionieren

>>> u=1./5
>>> print u
0.2
11
Gaurav Agarwal

Wenn Sie standardmäßig die Division "true" (Gleitkomma) verwenden möchten, gibt es ein Befehlszeilen-Flag:

python -Q new foo.py

Es gibt einige Nachteile (aus dem PEP):

Es wurde argumentiert, dass eine Befehlszeilenoption zum Ändern der Standardeinstellung böse ist. In den falschen Händen kann es sicher gefährlich sein: Beispielsweise wäre es unmöglich, ein Bibliothekspaket eines Drittanbieters, das -Qnew benötigt, mit einem anderen zu kombinieren, das -Qold benötigt.

Weitere Informationen zu den anderen Flags-Werten, die das Divisionsverhalten ändern/warnen, finden Sie auf der Manpage python.

Ausführliche Informationen zu Divisionsänderungen finden Sie unter: PEP 238 - Ändern des Divisionsoperators

6
stephenbez

wenn Sie eine Division von zwei Ganzzahlen durchführen, python wird Ihnen eine Ganzzahl zurückgeben, dann müssen Sie Folgendes tun:

c = float(a)/b

oder

c = a/float(b)

und dann c als float Typ erhalten

from operator import truediv

c = truediv(a, b)
3
JoeCondron

Das wird auch funktionieren

u = 1/5 print u

0.2

beantwortet 24. Dezember 13 um 19:58 Gaurav Agarwal 6.7172279140

Danke Gauraw, das macht den Trick und ist eine ganz ordentliche Lösung. Falls sowohl der Zähler als auch der Nenner Variablen sind, kann die "Lösung" 1. mit dem Quotienten multiplizieren.

Beispiel:

aa = 2
bb = 3

aa / bb = 0

1. * aa / bb = 0.6666666666666666

;-)

Max - Italien

1
Max1234-ITA
from operator import truediv

c = truediv(a, b)

dabei ist a die Dividende und b der Divisor. Diese Funktion ist praktisch, wenn der Quotient nach Division von zwei ganzen Zahlen ein Float ist.

1
Chetan Yeshi