web-dev-qa-db-fra.com

Python _ la division entière donne un flottant

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 des versions précédentes renvoyant int/int=int? Que dois-je faire, y a-t-il un nouvel opérateur de division ou dois-je toujours lancer?

198
Jonas Byström

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

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

257
Brandon E Taylor

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

52
Jonas Byström

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

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

Dans Python 2.7: Par défaut, l’opérateur de division renvoie un résultat en nombre entier.

obtenir le résultat en double multiple 1. à "dividende ou diviseur"

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

Dans 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
36
VijayNaidu

La réponse acceptée mentionne déjà PEP 238 . Je veux juste ajouter un regard rapide dans les coulisses pour ceux qui sont intéressés par ce qui se passe sans lire le PEP en entier.

Python mappe des opérateurs tels que +, -, * et / à des fonctions spéciales, telles que p. a + b est équivalent à

a.__add__(b)

En ce qui concerne la division dans Python 2, il n'y a par défaut que / qui mappe sur __div__ et le résultat dépend des types d'entrée (par exemple int, float).

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

  • / mappe sur __truediv__ qui doit "renvoyer une approximation raisonnable du résultat mathématique de la division" (citation du PEP 238)
  • // est mappé sur __floordiv__, ce qui devrait renvoyer le résultat pondéré de /

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 d'objet de Python.

Si vous voulez 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 //.

20
code_onkel