Was ist der Unterschied zwischen '/' und '//' bei der Division?


Antworten:


650

In Python 3.x 5 / 2wird zurückgegeben 2.5und 5 // 2wird zurückkehren 2. Ersteres ist Gleitkommadivision, und letzteres ist Bodenteilung , manchmal auch Ganzzahldivision genannt .

In Python 2.2 oder höher in der 2.x-Zeile gibt es keinen Unterschied für Ganzzahlen, es sei denn, Sie führen a aus from __future__ import division, wodurch Python 2.x das 3.x-Verhalten übernimmt.

Unabhängig vom zukünftigen Import 5.0 // 2wird zurückkehren, 2.0da dies das Ergebnis der Bodenteilung der Operation ist.

Eine ausführliche Beschreibung finden Sie unter https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


bearbeitet: Sie können die Teilung seit Python 2.2 "korrigieren"! (Lesen Sie einfach das verknüpfte PEP)
u0b34a0f6ae

2
auch python -Qnew. andere Abteilung Optionen: -Qold(Standard), -Qwarn,-Qwarnall
John La Rooy

2
Erwähnenswert, dass 5.0 / 2Renditen 2.5in allen Versionen, wie auch 5 / 2.0- das alte Verhalten ist nur anders , wenn beiden Operanden int.
Chris

2
Was ist, wenn die Zahlen negativ sind? Ist das Verhalten für negative ganze Zahlen dasselbe?
Aaron Franke

1
@Srinivasu Dein Beispiel ist nicht hilfreich. Besser wäre 5 // 2 (was 2 ergibt) und -5 // 2 (was -3 ergibt).
Marvin

67

Python 2.x Erläuterung:

Zur Verdeutlichung der Python 2.x-Linie /ist weder eine Bodenteilung noch eine echte Teilung erforderlich. Die aktuell akzeptierte Antwort ist dazu nicht klar.

/ist die Bodenteilung , wenn beide Argumente vorhanden sind int, ist jedoch die wahre Teilung, wenn eines oder beide Argumente vorhanden sind float.

Das Obige sagt mehr Wahrheit und ist klarer als der 2. Absatz in der akzeptierten Antwort.


33

//implementiert "Bodenteilung", unabhängig von Ihrem Typ. Also 1.0/2.0wird geben 0.5, aber beides 1/2, 1//2und 1.0//2.0wird geben 0.

Weitere Informationen finden Sie unter https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


Das ist eine gute Antwort. Der PEP-Link ist hilfreich. Erwägen Sie auch die Verwendung von math.floor()oder math.fmod()wenn Sie nicht sicher sind, was mit den unären Operatoren los ist.
Scott Lowrey

/und //sind zwei Operatoren (zwei Operanden, links und rechts, Zähler und Nenner)
iono

28

/ -> Gleitkommadivision

// -> Bodenteilung

Sehen wir uns einige Beispiele sowohl in Python 2.7 als auch in Python 3.5 an.

Python 2.7.10 vs. Python 3.5

print (2/3)  ----> 0                   Python 2.7
print (2/3)  ----> 0.6666666666666666  Python 3.5

Python 2.7.10 vs. Python 3.5

  print (4/2)  ----> 2         Python 2.7
  print (4/2)  ----> 2.0       Python 3.5

Wenn Sie nun (in Python 2.7) dieselbe Ausgabe wie in Python 3.5 haben möchten, können Sie Folgendes tun:

Python 2.7.10

from __future__ import division
print (2/3)  ----> 0.6666666666666666   #Python 2.7
print (4/2)  ----> 2.0                  #Python 2.7

Wobei es keinen Unterschied zwischen der Floor-Aufteilung in Python 2.7 und in Python 3.5 gibt

138.93//3 ---> 46.0        #Python 2.7
138.93//3 ---> 46.0        #Python 3.5
4//3      ---> 1           #Python 2.7
4//3      ---> 1           #Python 3.5

ist das dasselbe wie int (5/2)?
PirateApp

Was ist, wenn die Zahlen negativ sind? Ist das Verhalten für negative ganze Zahlen dasselbe?
Aaron Franke

1
Betreff: Negative - Das Verhalten ist das gleiche, aber denken Sie daran, dass das Ergebnis Boden ist, sodass die Rundung immer in Richtung negativer ist . Einige Beispiele: -100 // 33=> -4 ; 100 // -33=> -4 ; aber aufgrund der Rundungsrichtung der Bodenfunktion könnte die nächste im Vergleich zur vorherigen kontraintuitiv erscheinen: -100 // -33=> 3 .
Erdős-Bacon

22

Wie jeder schon geantwortet hat, //ist Bodenteilung.

Dies ist wichtig //, da es sich in allen Python-Versionen ab 2.2, einschließlich Python 3.x-Versionen , um eine eindeutige Unterteilung handelt.

Das Verhalten von /kann sich ändern in Abhängigkeit von:

  • Aktiver __future__Import oder nicht (modul-lokal)
  • Python-Befehlszeilenoption, entweder -Q oldoder-Q new

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

1
Hatte nicht bemerkt, dass die Bodenteilung auch mit Nicht-Ganzzahlen funktioniert. Vielen Dank!
Mike

5

Python 2.7 und andere kommende Versionen von Python:

  • Abteilung ( /)

Teilt den linken Operanden durch den rechten Operanden

Beispiel: 4 / 2 = 2

  • Floor Division ( //)

Die Division von Operanden, wobei das Ergebnis der Quotient ist, bei dem die Ziffern nach dem Dezimalpunkt entfernt werden. Wenn jedoch einer der Operanden negativ ist, ist das Ergebnis bodenständig, dh von Null weggerundet (in Richtung negative Unendlichkeit):

Beispiele: 9//2 = 4und 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

Sowohl die /Division als auch der //Betreiber der Floor Division arbeiten auf ähnliche Weise.


2
Gegen unendlich und weg von Null sind verschiedene Dinge. Beispiel für (-1,2 und 3,4): "Bodenbelag" ist gegen negative Unendlichkeit (-2 und 3), "Abschneiden" gegen Null (-1 und 3), "Sättigung" ist von Null entfernt (-2 und 4), und "Decke" ist gegen positive Unendlichkeit (-1 und 4).
Phernost


3

//Wenn es sich um eine Bodenteilung handelt, erhalten Sie immer die ganzzahlige Etage des Ergebnisses. Die andere ist "reguläre" Teilung.


2

Die Antwort der Gleichung wird auf die nächst kleinere Ganzzahl gerundet oder mit .0 als Dezimalpunkt aufgelegt.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0

2

Die obigen Antworten sind gut. Ich möchte noch einen Punkt hinzufügen. Bis zu einigen Werten ergeben beide den gleichen Quotienten. Danach //funktioniert der Floor Division Operator ( ) einwandfrei, der Division ( /) Operator jedoch nicht .

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer

-1

5.0//2Dies 2.0führt zu und nicht, 2weil der Rückgabetyp des Rückgabewerts vom //Operator den Regeln für Python-Zwang (Typumwandlung) folgt.

Python fördert die Konvertierung eines niedrigeren Datentyps (Ganzzahl) in einen höheren Datentyp (Float), um Datenverlust zu vermeiden.


-1
  • // Wenn es sich um eine Bodenteilung handelt, erhalten Sie immer den Bodenwert des Ergebnisses.
  • Und die andere /ist die Gleitkommadivision.

Folgendes ist der Unterschied zwischen /und //; Ich habe diese arithmetischen Operationen in Python 3.7.2 ausgeführt

>>> print (11 / 3)
3.6666666666666665

>>> print (11 // 3)
3

>>> print (11.3 / 3)
3.7666666666666667

>>> print (11.3 // 3)
3.0

2
Wie fügt diese Antwort etwas hinzu, das die anderen Ideen nicht abdecken? Oder wie ist diese Antwort in irgendeiner Weise besser als die anderen Antworten?
Rory Daulton

2
Das Folgende ist die Ausgabe eines Programms. Es erklärt nichts.
Marquis von Lorne
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.