9 votes

Qu'est-ce qui détermine le signe de m % n pour les entiers ?

Le modulo en Python est déroutant.

En Python, % calcule le reste :

>>> 9 % 5
4

Cependant :

>>> -9 % 5
1

Pourquoi le résultat est-il 1 ? et non -4 ?

14voto

wim Points 35274

Parce qu'en python, le signe correspond au dénominateur.

>>> 9 % -5
-1
>>> -9 % 5
1

Pour savoir pourquoi il a été mis en œuvre de cette manière, lisez le document suivant blog post by Guido .

5voto

Lennart Regebro Points 52510

-10 % 5 est égal à 0, c'est-à-dire que -10 est divisé par 5.

Vous demandez pourquoi -9 % 5 n'est pas -4, et la réponse est que 1 et -4 peuvent être des réponses correctes, cela dépend de ce que représente -9 divisé par 5. Bien sûr, -9 divisé par 5 est 1,8, mais il s'agit d'une division entière, représentée en Python 3 par //, et j'utiliserai donc // ici pour préciser qu'il s'agit bien d'une division entière.

Je vais expliquer cela en n'utilisant pas de nombres négatifs, c'est plus facile.

9 // 5, c'est 1. Autrement dit, on ne peut soustraire 5 de 9 qu'une seule fois, et le reste est 4. Mais si on soustrait 5 de 9 une fois de plus, alors le reste devient -1 !

Donc -1 est une réponse correcte à 9 % 5, si 9 // 5 est 2.

En Python 9 // 5 est 1, car la division des entiers en Python est une division par le sol, c'est-à-dire qu'elle arrondit toujours. vers le bas . S'il est arrondi monter 9 // 5 serait deux, et 9 % 5 aurait été -1.

Examinons maintenant le cas où nous utilisons des nombres négatifs : -9 divisé par 5 donne -2. Comme il s'agit d'une division par le sol, l'arrondi se fait toujours vers le bas. Cela signifie que le reste est égal à 1. Ainsi, -9 % 5 est égal à 1, et non à -4.

3voto

kalhartt Points 1505

Cela est lié à la façon dont Python arrondit les divisions d'entiers.

Mathématiquement, ce qui suit doit toujours être vrai pour tout int x et y

x == (x // y) * y + x % y

On peut donc en déduire que

x % y == x - (x // y) * y

Rappelons que python arrondit les divisions entières vers l'infini négatif, et non vers zéro. Par exemple -9 // 5 donne -2, et non -1. Avec cette logique, on obtient -9 % 5 = 1

2voto

Patashu Points 14053

Pensez-y de la manière suivante :

0 % 5 est 0

1 % 5 est 1

Et si vous reveniez en arrière ?

-1 % 5 doit être 4

-2 % 5 doit être 3

et ainsi de suite.

Vous verrez qu'après -9 % 5 est 1

REMARQUE : Selon le langage de programmation et l'implémentation de %, vous pouvez obtenir des résultats différents, car les programmeurs ne sont pas d'accord sur la manière de traiter les nombres négatifs dans %.

0voto

Wanderer Points 1

Dans les nombres entiers, on ne peut pas toujours choisir un quotient tel que quotient * divisor == dividend . Si le product n'est pas égale à la dividend Il faut toujours faire un choix, celui de le rendre légèrement inférieur à l'objectif de l'Union européenne. dividend ou légèrement supérieure à la dividend . La somme des product avec le remainder fait de la dividend c'est ce que la remainder est. Dans tous les cas, les dividendes et les produits doivent être proches, c'est-à-dire que la valeur absolue du reste doit être inférieure à celle du diviseur.

Lorsque le divisor est positif, le products augmentent au fur et à mesure que la quotients augmentent ; lorsque le divisor est négatif, le products diminue au fur et à mesure que la quotients augmentation. Dans le premier cas, les produits vont du bas vers le haut, dans le second cas, les produits vont du haut vers le bas. En Python, dans les deux cas, le prochain quotient n'est prise que lorsque le dividend atteint le prochain product Les produits de l'Union européenne sont en train de suivre le même chemin que les produits eux-mêmes. Avant cela, seuls les remainder changements pour s'adapter à la prochaine dividend Le taux d'intérêt à long terme, qui va toujours dans le même sens que la variation des dividendes, sans rupture à zéro, est de 1,5 %. Cette règle est universelle en Python, elle est toujours valable.

Ce n'est pas la raison pour laquelle ce choix a été fait, mais cela donne une idée de ce qui se passe (c'est-à-dire pourquoi les résultats sont ce qu'ils sont, et à quels résultats s'attendre).

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