Python Integer Division ergibt float


223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Ist das beabsichtigt? Ich erinnere mich stark an frühere Versionen, die zurückgekehrt sind int/int=int? Was soll ich tun, gibt es einen neuen Divisionsoperator oder muss ich immer gießen?


31
Ja, so funktioniert Division in 3.x.
Hughdbrown

2
Hier ist ein Beitrag von Pythons Schöpfer, der darüber spricht, wie die Rundung funktioniert. Er ist orthogonal zu Ihrer Frage, aber ich fand ihn interessant: python-history.blogspot.com/2010/08/…
Aaron D

@hughdbrown bedeutet das für alle Python 3-Versionen im Wesentlichen?
Charlie Parker

@hughdbrown: Ja, PEP ist endgültig , dh akzeptiert und implementiert.
Jonas Byström

Antworten:


285

Schauen Sie sich PEP-238 an : Ändern des Divisionsoperators

Der Operator // steht zur Verfügung, um die Unterteilung des Bodens eindeutig anzufordern.


10
@ JonathanSternberg mit Ausnahme des gesamten Codes, der für Python 2.0 geschrieben wurde. Ich bin der Meinung, dass die Rolle von / und // vertauscht werden sollte, um die Abwärtskompatibilität zu gewährleisten. Auch in so ziemlich jeder anderen Sprache / bewahrt Typ. Ich würde dann mehr Sinn machen, wenn // automatisch in float konvertiert, nicht /.
Thang

1
Der zweite Teil (nach dem "Also") ist sinnvoll (Ähnlichkeit mit anderen Sprachen), aber in Bezug auf den ersten Teil bestand der Sinn von Python 3 darin, NICHT abwärtskompatibel mit Python 2 zu sein, sondern eine Reihe von Problemen mit Python zu beheben 2. Genug Leute fanden die Zweideutigkeit /, genug von einem Sprachdesign- "Fehler" zu sein, der in Python 3 behoben werden musste. Es mag eine kontroverse Entscheidung gewesen sein, aber genug Leute hielten es für die richtige. Zählen Sie mich zu der Gruppe, die die Veränderung liebt. Es ist schön, dass wir uns alle darauf einigen können, nicht zuzustimmen. Prost. :)
Ray Toal

59

Ups, sofort gefunden 2//2.


5
Könnten Sie näher darauf eingehen?
blueFast

4
Wenn Sie dies verwenden, wird ein int ausgegeben, kein float @dangonfast.
Ashish Ahuja

Dies scheint bei negativen Zahlen nicht zu funktionieren. -1 // 5 gibt -1 zurück und -5 // 5 gibt -1 zurück.
Mschuett

@mschuett: Dies ist zu erwarten und ist das gleiche Ergebnis wie mit Python 2.
Jonas Byström

1
Ja, ich habe noch ein bisschen gegraben und das auch herausgefunden. Ich würde mir jedoch vorstellen, dass eine anständige Anzahl von Menschen dies je nach Sprache, aus der sie kommen, nicht erkennt.
Mschuett

45

Hoffe, es könnte sofort jemandem helfen.

Verhalten des Divisionsoperators in Python 2.7 und Python 3

In Python 2.7: Standardmäßig gibt der Divisionsoperator eine ganzzahlige Ausgabe zurück.

um das Ergebnis in einem doppelten Vielfachen von 1,0 zu "Dividende oder Divisor" zu erhalten

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

In Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

1
Übrigens muss nicht mit 1.0 multipliziert werden. Es reicht aus, dass eine der Zahlen ein Float ist. ZB 100 / 35,0 = 100,0 / 35 = 2,857142857142857
Tal J. Levy,

21

In der akzeptierten Antwort wird bereits PEP 238 erwähnt . Ich möchte nur einen kurzen Blick hinter die Kulissen für diejenigen werfen, die daran interessiert sind, was los ist, ohne den gesamten PEP zu lesen.

Python Karten Operatoren wie +, -, *und /auf spezielle Funktionen, so dass zB a + bentspricht

a.__add__(b)

In Bezug auf die Unterteilung in Python 2 gibt es standardmäßig nur /die Zuordnung __div__und das Ergebnis hängt von den Eingabetypen ab (z int.float ).

In Python 2.2 wurde die __future__Funktion eingeführt division, mit der die Divisionssemantik folgendermaßen geändert wurde (TL; DR von PEP 238):

  • /Karten, zu __truediv__denen "eine vernünftige Annäherung an das mathematische Ergebnis der Division zurückgegeben werden muss" (Zitat aus PEP 238)
  • //Karten zu __floordiv__, die das Bodenergebnis von zurückgeben sollten/

Mit Python 3.0 wurden die Änderungen von PEP 238 zum Standardverhalten, und __div__das Objektmodell von Python enthält keine spezielle Methode mehr .

Wenn Sie denselben Code in Python 2 und Python 3 verwenden möchten, verwenden Sie

from __future__ import division

und halten Sie sich an die PEP 238-Semantik von /und //.


0

Laut der Python3-Dokumentation generiert Python, wenn es durch eine Ganzzahl geteilt wird, Float, obwohl erwartet wird, dass es eine Ganzzahl ist.

Verwenden Sie zum ausschließlichen Drucken von Ganzzahlen floor division method. Die Bodenteilung rundet Null ab und entfernt den Dezimalpunkt.Represented by //

Verwenden Sie daher anstelle von 2/2 2//2

Sie können auch eine Division aus importieren __future__ unabhängig von der Verwendung von Python2 oder Python3 importieren.

Ich hoffe es hilft!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.