59 votes

Division d'entiers négatifs résultat surprenant

Dans mon application, j'ai rencontré le cas suivant et j'ai été surpris par les résultats :

8/-7=-2 (tous deux entiers).

Qu'est-ce que cela signifie ?

0 votes

Dans Python 2 uniquement ? Dans Python 3.8.10 (approx. 2021-11-26), le résultat à l'écran est le suivant -1.1428571428571428 .

58voto

Chris Cooper Points 7619

Pour les valeurs réelles, c'est-à-dire 8.0/(-7.0) le résultat est à peu près le suivant -1.143 .

Le résultat de la division entière est arrondi vers le bas, vers la valeur plus négative de -2 . (Ceci est également connu sous le nom de "Floor division")

C'est pourquoi vous obtiendrez les réponses quelque peu perplexes suivantes :

>>> 8/(-7)
-2
>>> 8/7
1

Remarque : Ceci est "corrigé" dans Python 3, où le résultat de 8/(-7) serait -1.143 . Donc si vous n'avez aucune raison d'utiliser Python 2, vous devriez le mettre à jour ;)

En Python 3, si vous souhaitez toujours effectuer une division entière, vous pouvez utiliser la fonction // de l'opérateur. Vous obtiendrez la même réponse que 8/(-7) dans Python 2.

Voici une proposition d'amélioration de Python sur le sujet : PEP 238 -- Changement d'opérateur de division

21voto

ZH.Jay Points 181

Python effectue toujours la "division plancher" pour la division des nombres négatifs et la division des nombres positifs.

C'est-à-dire

1/10 = 0
1/-10 = -1

Mais il arrive que nous ayons besoin que 1/-10 soit égal à 0

Je me suis rendu compte qu'il était possible de le faire en utilisant d'abord la division des flottants, puis en convertissant le résultat en int, par exemple.

int(float(1)/-10) = 0

Cela fonctionne bien pour moi, pas besoin d'importer la future division ou de passer à Python 3.

J'espère que cela pourra vous aider~

8voto

Andrea Zonca Points 2194

Pour que Python convertisse automatiquement la division entière en division flottante, vous pouvez utiliser :

from __future__ import division

Aujourd'hui :

8/-7=-1.1428571428571428

Cette fonctionnalité ne figure pas dans la version standard de Python 2 afin de ne pas casser le code existant qui s'appuie sur la division d'entiers.

Cependant, c'est le comportement par défaut de Python 3.

3voto

Lossy Points 158

Lorsque les deux valeurs sont des entiers, Python utilise la division Floor pour effectuer la division.

0 votes

Mais seulement pour Python 2 ? Peut-être mettre à jour votre réponse ( sans "Modifier :", "Mettre à jour :", ou similaire - la réponse doit apparaître comme si elle avait été écrite aujourd'hui) ?

-1voto

Rumple Stiltskin Points 2309

En Python, / est destiné à la division des nombres entiers. Vous pouvez le considérer comme une division de flottants suivie d'un floor l'opération.

Par exemple,

8/7 == floor(8.0/7.0) == 1

8/-7 == floor(8.0/-7.0) == -2

1 votes

Non, / n'est pas pour la division des entiers, c'est pour la division. Cependant, en Python 2, la division de deux entiers renvoie un entier. Ceci est surprenant et a été corrigé dans Python 3.

3 votes

@Lennart : Pas vraiment un choc pour les programmeurs C, ni pour quiconque ayant lu le manuel, et pas "faux".

1 votes

@John : Elle viole les principes fondamentaux de Python et peut donc être qualifiée de "mauvaise" dans le contexte de Python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X