Qual è la differenza tra '/' e '//' quando usato per la divisione?


474

C'è un vantaggio nell'usare l'uno rispetto all'altro? In Python 2, entrambi sembrano restituire gli stessi risultati:

>>> 6/3
2
>>> 6//3
2

1
Si prega di fare riferimento al problema con la// divisione dei numeri interi per il motivo dell'introduzione dell'operatore nella divisione dei numeri interi.
Sriram,

Risposte:


651

In Python 3.x, 5 / 2tornerà 2.5e 5 // 2tornerà 2. Il primo è la divisione in virgola mobile e il secondo è la divisione del pavimento , a volte anche chiamata divisione intera .

In Python 2.2 o versioni successive nella riga 2.x, non vi è alcuna differenza per gli interi a meno che non si esegua a from __future__ import division, il che fa sì che Python 2.x adotti il ​​comportamento 3.x.

Indipendentemente dalla futura importazione, 5.0 // 2tornerà 2.0poiché questo è il risultato della divisione del piano dell'operazione.

Puoi trovare una descrizione dettagliata su https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


a cura di: puoi "correggere" la divisione da Python 2.2! (Basta leggere il PEP collegato)
u0b34a0f6ae

2
anche python -Qnew. altre opzioni di divisione: -Qold(default), -Qwarn,-Qwarnall
John La Rooy

2
Vale la pena sottolineare che 5.0 / 2ritorna 2.5in tutte le versioni, così come 5 / 2.0il vecchio comportamento è diverso solo quando entrambi gli operandi lo sono int.
Chris,

2
Che dire di quando i numeri sono negativi? Il comportamento è lo stesso per gli interi negativi?
Aaron Franke,

1
@Srinivasu Il tuo esempio non è utile. Meglio sarebbe 5 // 2 (che produce 2) e -5 // 2 (che produce -3).
Marvin,

67

Chiarimento su Python 2.x:

Chiarire per la linea Python 2.x, /non è né divisione del pavimento né vera divisione. La risposta attualmente accettata non è chiara su questo.

/è la divisione del piano quando lo sono entrambi gli arg int, ma è la vera divisione quando uno o entrambi gli arg sono float.

Quanto sopra dice più verità ed è più chiaro del secondo paragrafo nella risposta accettata.


33

//implementa la "divisione del pavimento", indipendentemente dal tipo. Così 1.0/2.0darà 0.5, ma entrambi 1/2, 1//2e 1.0//2.0darà 0.

Vedi https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator per i dettagli


Questa è una buona risposta Il collegamento PEP è utile. Inoltre, considera l'utilizzo math.floor()o math.fmod()se non sei sicuro di cosa stia succedendo con gli operatori unari.
Scott Lowrey,

/e //sono operatori biennali (due operandi, sinistra e destra, numeratore e denominatore)
iono

28

/ -> Divisione in virgola mobile

// -> Divisione del pavimento

Vediamo alcuni esempi sia in Python 2.7 che in Python 3.5.

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

Ora se vuoi avere (in python 2.7) lo stesso output di python 3.5, puoi fare quanto segue:

Python 2.7.10

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

Dove non c'è differenza tra la divisione Floor sia in Python 2.7 che in Python 3.5

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

è lo stesso di int (5/2)?
PirateApp

Che dire di quando i numeri sono negativi? Il comportamento è lo stesso per gli interi negativi?
Aaron Franke,

1
Ri: Negativi - Il comportamento è lo stesso, ma ricorda che il risultato è piano, quindi l'arrotondamento è sempre verso il basso verso più negativo . Alcuni esempi: -100 // 33=> -4 ; 100 // -33=> -4 ; ma a causa della direzione di arrotondamento della funzione pavimento, il prossimo potrebbe sembrare controintuitivo rispetto al precedente: -100 // -33=> 3 .
Erdős-Bacon,

22

Come tutti hanno già risposto, //è divisione del pavimento.

Perché questo è importante è la //divisione dei piani inequivocabile, in tutte le versioni di Python dalla 2.2, comprese le versioni di Python 3.x.

Il comportamento di /può cambiare in base a:

  • __future__Importazione attiva o meno (modulo locale)
  • Opzione della riga di comando di Python, o -Q oldo-Q new

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

1
Non avevo capito che anche la divisione del piano funziona con numeri non interi. Grazie!
Mike,

5

Python 2.7 e altre versioni imminenti di python:

  • Division ( /)

Divide l'operando della mano sinistra per l'operando della mano destra

Esempio: 4 / 2 = 2

  • Floor Division ( //)

La divisione degli operandi in cui il risultato è il quoziente in cui vengono rimosse le cifre dopo il punto decimale. Ma se uno degli operandi è negativo, il risultato viene pavimentato, ovvero arrotondato da zero (verso l'infinito negativo):

Esempi: 9//2 = 4e 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

Sia /Division e //pavimento operatore di divisione stanno operando in modo simile.


2
Verso l'infinito e lontano da zero ci sono cose diverse. Esempio per (-1.2 e 3.4): "pavimentazione" è verso l'infinito negativo (-2 e 3), "troncamento" è verso zero (-1 e 3), "saturazione" è lontano da zero (-2 e 4), e "soffitto" è verso l'infinito positivo (-1 e 4).
Phernost,

4

La doppia barra //, è la divisione del pavimento:

>>> 7//3
2

3

//è la divisione del piano, ti darà sempre il numero intero del risultato. L'altra è la divisione "regolare".


2

La risposta dell'equazione viene arrotondata al numero intero più piccolo successivo o float con .0 come punto decimale.

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

2

Le risposte sopra sono buone. Voglio aggiungere un altro punto. Fino ad alcuni valori entrambi generano lo stesso quoziente. Dopo che l'operatore di divisione del piano ( //) funziona bene ma non l' /operatore di divisione ( ).

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

-1

5.0//2risulta 2.0, e non 2perché il tipo restituito dal valore restituito //dall'operatore segue le regole di coercizione di pitone (tipo casting).

Python promuove la conversione del tipo di dati inferiore (intero) in un tipo di dati superiore (float) per evitare la perdita di dati.


-1
  • // è la divisione del pavimento, ti darà sempre il valore del pavimento del risultato.
  • E l'altro /è la divisione in virgola mobile.

I seguenti sono la differenza tra /e //; Ho eseguito queste operazioni aritmetiche in Python 3.7.2

>>> print (11 / 3)
3.6666666666666665

>>> print (11 // 3)
3

>>> print (11.3 / 3)
3.7666666666666667

>>> print (11.3 // 3)
3.0

2
In che modo questa risposta aggiunge qualcosa che le altre idee non coprono? O come è migliore questa risposta in qualche modo rispetto alle altre risposte?
Rory Daulton,

2
Di seguito è l'output di un programma. Non spiega nulla.
Marchese di Lorne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.