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
?
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
?
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 .
-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.
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
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 %.
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 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.