Quelle est la différence entre '/' et '//' lorsqu'il est utilisé pour la division?

474

Y a-t-il un avantage à utiliser l'un sur l'autre? En Python 2, ils semblent tous deux renvoyer les mêmes résultats:

>>> 6/3
2
>>> 6//3
2
Rayon
la source
1
Veuillez vous référer au problème de la division// entière pour connaître la raison de l'introduction de l' opérateur pour effectuer la division entière.
Sriram

Réponses:

651

Dans Python 3.x, 5 / 2reviendra 2.5et 5 // 2reviendra 2. La première est une division en virgule flottante, et la seconde est une division au sol , parfois aussi appelée division entière .

Dans Python 2.2 ou version ultérieure de la ligne 2.x, il n'y a pas de différence pour les entiers à moins que vous n'effectuiez un from __future__ import division, ce qui fait que Python 2.x adopte le comportement 3.x.

Quelle que soit la future importation, 5.0 // 2elle reviendra, 2.0car c'est le résultat de la division du sol de l'opération.

Vous pouvez trouver une description détaillée sur https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator

Eli Courtwright
la source
édité: Vous pouvez "corriger" la division depuis Python 2.2! (Il suffit de lire le PEP lié)
u0b34a0f6ae
2
aussi python -Qnew. d' autres options de division: -Qold(par défaut), -Qwarn,-Qwarnall
John La Rooy
2
A signaler que le 5.0 / 2rendement 2.5dans toutes les versions, tout comme 5 / 2.0- l'ancien comportement ne diffère lorsque les deux opérandes sont int.
Chris
2
Et quand les chiffres sont négatifs? Le comportement est-il le même pour les entiers négatifs?
Aaron Franke
1
@Srinivasu Votre exemple n'est pas utile. Mieux vaut 5 // 2 (qui donne 2) et -5 // 2 (qui donne -3).
Marvin
67

Clarification Python 2.x:

Pour clarifier la ligne Python 2.x, il /n'y a ni division au sol ni division vraie. La réponse actuellement acceptée n'est pas claire à ce sujet.

/est la division du plancher lorsque les deux arguments le sont int, mais est la véritable division lorsque l' un ou les deux arguments le sont float.

Ce qui précède dit plus de vérité et est plus clair que le 2ème paragraphe de la réponse acceptée.

Yichun
la source
33

//implémente la "division du sol", quel que soit votre type. Alors 1.0/2.0donnera 0.5, mais les deux 1/2, 1//2et 1.0//2.0donnera 0.

Voir https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator pour plus de détails

Kena
la source
C'est une bonne réponse. Le lien PEP est utile. Envisagez également d'utiliser math.floor()ou math.fmod()si vous n'êtes pas sûr de ce qui se passe avec les opérateurs unaires.
Scott Lowrey
/et //sont des opérateurs binaires (deux opérandes, gauche et droite, numérateur et dénominateur)
iono
28

/ -> Division en virgule flottante

// -> Division étage

Voyons quelques exemples à la fois en python 2.7 et en Python 3.5.

Python 2.7.10 contre Python 3.5

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

Python 2.7.10 contre Python 3.5

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

Maintenant, si vous voulez avoir (en python 2.7) la même sortie qu'en python 3.5, vous pouvez faire ce qui suit:

Python 2.7.10

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

Là où il n'y a pas de différence entre la division Floor en python 2.7 et en 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
N Randhawa
la source
est-ce la même chose que int (5/2)?
PirateApp
Et quand les chiffres sont négatifs? Le comportement est-il le même pour les entiers négatifs?
Aaron Franke
1
Re: Négatifs - Le comportement est le même, mais rappelez - vous que le résultat est étage, arrondi donc est toujours vers le bas vers plus négatif . Quelques exemples: -100 // 33=> -4 ; 100 // -33=> -4 ; mais en raison de la direction d'arrondi de la fonction plancher, la suivante pourrait sembler contre-intuitive par rapport à la précédente: -100 // -33=> 3 .
Erdős-Bacon
22

Comme tout le monde a déjà répondu, //c'est la division du sol.

Ce qui est important, c'est que la //division de l'étage est sans ambiguïté, dans toutes les versions Python de 2.2, y compris les versions Python 3.x.

Le comportement de /peut changer selon:

  • __future__Importation active ou non (module local)
  • Option de ligne de commande Python, soit -Q oldou-Q new
u0b34a0f6ae
la source
10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0
Jonas Sciangula Street
la source
1
N'avait pas réalisé que la division du sol fonctionne également avec des non-entiers. Merci!
Mike
5

Python 2.7 et une autre version à venir de python:

  • Division ( /)

Divise l'opérande de gauche par l'opérande de droite

Exemple: 4 / 2 = 2

  • Division de plancher ( //)

La division des opérandes où le résultat est le quotient dans lequel les chiffres après le point décimal sont supprimés. Mais si l'un des opérandes est négatif, le résultat est plancher, c'est-à-dire arrondi à zéro (vers l'infini négatif):

Exemples: 9//2 = 4et 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

L' opérateur de la /division et celui de la //division des sols fonctionnent de manière similaire.

Abrar Ahmad
la source
2
Vers l'infini et loin de zéro, ce sont des choses différentes. Exemple pour (-1.2 et 3.4): "plancher" est vers l'infini négatif (-2 et 3), "tronquer" est vers zéro (-1 et 3), "saturer" est loin de zéro (-2 et 4), et "plafond" est vers l'infini positif (-1 et 4).
Phernost
4

La double barre oblique,, //est la division au sol:

>>> 7//3
2
Mark Roddy
la source
3

//est la division du plancher, il vous donnera toujours le plancher entier du résultat. L'autre est la division «régulière».

Adam Bellaire
la source
2

La réponse de l'équation est arrondie au plus petit entier ou flottant suivant avec 0,0 comme point décimal.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
G.Ant
la source
2

Les réponses ci-dessus sont bonnes. Je veux ajouter un autre point. Jusqu'à certaines valeurs, les deux donnent le même quotient. Après cet opérateur de division de plancher ( //) fonctionne bien, mais pas l' /opérateur de division ( ).

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer
jaya ram
la source
-1

5.0//2résulte en 2.0, et non 2parce que le type de retour de la valeur de retour de l' //opérateur suit les règles de coercition python (conversion de type).

Python favorise la conversion du type de données inférieur (entier) en type de données supérieur (float) pour éviter la perte de données.

Sebastian Purakan
la source
-1
  • // est la division du sol, il vous donnera toujours la valeur au sol du résultat.
  • Et l'autre /est la division en virgule flottante.

Les suivis sont la différence entre /et //; J'ai exécuté ces opérations arithmétiques dans 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
Fatema T. Zuhora
la source
2
Comment cette réponse ajoute-t-elle quelque chose que les autres idées ne couvrent pas? Ou comment cette réponse est-elle meilleure que les autres réponses?
Rory Daulton
2
Ce qui suit est la sortie d'un programme. Cela n'explique rien.
Marquis de Lorne