La division entière de Python donne un flottant

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

Est-ce prévu? Je me souviens très bien du retour des versions antérieures int/int=int? Que dois-je faire, y a-t-il un nouvel opérateur de division ou dois-je toujours caster?

Jonas Byström
la source
31
Oui, c'est ainsi que fonctionne la division dans 3.x.
hughdbrown
2
Voici un article du créateur de Python parlant du fonctionnement de l'arrondi, il est orthogonal à votre question mais je l'ai trouvé intéressant: python-history.blogspot.com/2010/08/…
Aaron D
@hughdbrown donc cela signifie essentiellement pour toutes les versions de python 3?
Charlie Parker
@hughdbrown: oui, le PEP est définitif , ce qui signifie à la fois accepté et mis en œuvre.
Jonas Byström

Réponses:

285

Jetez un œil à PEP-238 : Changer d'opérateur de division

L'opérateur // sera disponible pour demander la division du sol sans ambiguïté.

Brandon E Taylor
la source
10
@JonathanSternberg à l'exception de tout le code qui a été écrit pour python 2.0. Je pense que le rôle de / et // devrait être inversé pour conserver la compatibilité descendante. En outre, dans à peu près tous les autres types de langue / conserve. je ferais alors plus de sens pour que // se convertisse automatiquement en float, pas /.
thang
1
La deuxième partie (après le "Aussi") a du sens (similitude avec d'autres langages) mais en ce qui concerne la première partie, tout l' intérêt de Python 3 ne devait PAS être rétrocompatible avec Python 2, mais plutôt corriger un tas de problèmes avec Python 2. Assez de gens ont trouvé l'ambiguïté d' /être une "erreur" de conception de langage qui devait être corrigée en Python 3. Cela a peut-être été une décision controversée, mais suffisamment de gens ont estimé que c'était la bonne. Comptez-moi dans le groupe qui aime le changement. C'est bien que nous puissions tous être d'accord pour ne pas être d'accord. À votre santé. :)
Ray Toal
59

Oups, trouvé immédiatement 2//2.

Jonas Byström
la source
5
Pourriez-vous élaborer?
blueFast
4
L'utilisation de ceci produira un int, pas un float @dangonfast.
Ashish Ahuja
Cela semble ne pas fonctionner pour les nombres négatifs. -1 // 5 renvoie -1 et -5 // 5 renvoie -1.
mschuett
@mschuett: c'est normal et c'est le même résultat qu'avec Python 2.
Jonas Byström
1
Oui, j'ai creusé un peu plus et je l'ai aussi découvert. Cependant, j'imagine qu'un nombre décent de personnes ne s'en rendent pas compte en fonction de la langue d'origine.
mschuett
45

J'espère que cela pourrait aider quelqu'un instantanément.

Comportement de l'opérateur de division dans Python 2.7 et Python 3

En Python 2.7: Par défaut, l'opérateur de division retournera une sortie entière.

pour obtenir le résultat en double multiple 1.0 en "dividende ou diviseur"

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

En 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
VijayNaidu
la source
1
Soit dit en passant, pas besoin de multiplier par 1,0. Il suffit qu'un des nombres soit un flotteur. Par exemple, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy
21

La réponse acceptée mentionne déjà PEP 238 . Je veux juste ajouter un rapide coup d'œil dans les coulisses pour ceux qui s'intéressent à ce qui se passe sans lire l'intégralité du PEP.

Opérateurs Python cartes comme +, -, *et /à des fonctions spéciales, telles que par exemple a + best équivalent à

a.__add__(b)

En ce qui concerne la division en Python 2, il n'y a par défaut que les /mappages __div__et le résultat dépend des types d'entrée (par exemple int, float).

Python 2.2 a introduit la __future__fonctionnalité division, qui a changé la sémantique de division de la manière suivante (TL; DR de PEP 238):

  • /des cartes __truediv__auxquelles doit "renvoyer une approximation raisonnable du résultat mathématique de la division" (citation du PEP 238)
  • //correspond à __floordiv__, qui devrait renvoyer le résultat/

Avec Python 3.0, les modifications de PEP 238 sont devenues le comportement par défaut et il n'y a plus de méthode spéciale __div__dans le modèle objet de Python.

Si vous souhaitez utiliser le même code dans Python 2 et Python 3, utilisez

from __future__ import division

et s'en tenir à la sémantique PEP 238 de /et //.

code_onkel
la source
0

Selon la documentation de Python3, python, lorsqu'il est divisé par un entier, générera un flottant bien qu'il soit censé être un entier.

Pour imprimer exclusivement des nombres entiers, utilisez floor division method. La division du sol arrondit zéro et supprime le point décimal.Represented by //

Par conséquent, au lieu de 2/2, utilisez 2//2

Vous pouvez également importer la division __future__indépendamment de l'utilisation de python2 ou python3.

J'espère que ça aide!

Aditi
la source