Wie kann ich die Division als Fließkommazahl erzwingen? Division rundet immer auf 0 ab?

Lesezeit: 5 Minuten

Benutzer-Avatar
Nathan Fellmann

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 / bwenn 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

Benutzer-Avatar
Michael Fairley

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

  • Beachten Sie, dass from __future__ import division muss ganz am Anfang der Datei stehen

    – Yannis

    20. August 2017 um 17:50 Uhr

  • Das Problem ist auch, wenn Sie die Integer-Division an einer Stelle, aber die Float-Division an einer anderen Stelle der Datei haben möchten …

    – Quecksilber0114

    23. Juli 2019 um 10:26 Uhr


  • @mercury0114: Kein Problem; Sie verwenden nur // wenn Sie Bodenaufteilung wünschen, und / wenn du “wahr” willst (float) Aufteilung.

    – ShadowRanger

    4. Februar 2020 um 14:01 Uhr

  • Danke für diese Antwort! Hat mich wahnsinnig gemacht. Warum um alles in der Welt haben sie sich dafür entschieden, das in Python 2 zu tun? Das habe ich noch nie gesehen.

    – xxSithRagexx

    27. Februar 2021 um 18:31 Uhr

  • @xxSithRagexx Python 2 folgte einer gemeinsamen Konvention aus anderen Sprachen, insbesondere C – int dividiert durch int erzeugte ein int-Ergebnis. In Python 3 erkannten sie, dass dies nicht intuitiv war, und änderten es.

    – Markieren Sie Lösegeld

    20. Juli um 4:04 Uhr

Benutzer-Avatar
Steve Forelle

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.

Benutzer-Avatar
Russland muss Putin entfernen

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

  • “1 // 2 = 0”, “1 // 2.0 = 0.0” — interessantes kleines Problem, selbst wenn es sich um eine ganzzahlige Division handelt, wenn einer der Operanden Float ist, dann ist das Ergebnis eine ganze Zahl, aber auch Float. Ich habe eine ganzzahlige Division verwendet, um einen Listenindex zu berechnen, und habe deshalb einen Fehler erhalten.

    – R. Navega

    16. Dezember 2018 um 20:46 Uhr

  • ich bevorzuge a / (b + 0.0) nur weil die Addition normalerweise schneller ist als die Multiplikation, selbst wenn der Unterschied vernachlässigbar ist.

    – Markieren Sie Lösegeld

    20. Juli um 4:08 Uhr

c = a / (b * 1.0)

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

Benutzer-Avatar
Georgi

Fügen Sie einen Punkt hinzu (.), um Fließkommazahlen anzugeben

>>> 4/3.
1.3333333333333333

  • Wie werden Sie diesen Ansatz anwenden, wenn sowohl Zähler als auch Nenner Variablen sind?

    – Stackoverflowuser2010

    12. August 2016 um 19:03 Uhr

  • Ich nehme an, Sie beziehen sich auf das erste Beispiel, wenn dem so ist, würde ich einfach verwenden float() auf einer der Variablen.

    – Alexander

    13. August 2016 um 20:00 Uhr


1137200cookie-checkWie kann ich die Division als Fließkommazahl erzwingen? Division rundet immer auf 0 ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy