

Pythonコード

[code]

    print(-7 % 2)  # 1
    print(-7 % 3)  # 2
    print(7 % -2)  # -1
    print(-7 % 3)  # 2
    print(7 % -3)  # -2
    
[/code]

となるのですが、理由が分かりません？


CC BY-SA 4.0
2020-05-03T06:12:47.837
66236
2020-05-03T13:05:55.200
2020-05-03T06:18:04.623
39956
39956
question
python
Python で、負の数を使った剰余算について


まず演算子の結合順序について、Python では `%` より単項のマイナス `-`
の方が[優先度が高い](https://docs.python.org/3/reference/expressions.html#operator-
precedence)ので、たとえば `-7 % 2` は `(-7) % 2` と解釈されます。`-(7 % 2)` ではないです。

そして Python の余り演算子 `%`
はふたつ目の引数と[同じ符号の余りを返します](https://docs.python.org/3/reference/expressions.html#binary-
arithmetic-operations)。このため `(-7) % 2` は `1` を返しますが、`7 % (-2)` は `-1` を返します。

この「結合の優先順序」「負の数が絡んだ場合の余り」はプログラミング言語によって[仕様が異なる](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97)ため、まずはドキュメントを確認してみてください。

* * *

※補足：`-7 % 3` が `2` になる理由

これは Python 以前に数学の話ですが、-7 = 3 * (-3) + 2 と書くと余りは 2 になります。  
また -7 = 3 * (-2) - 1 と捉えて余りを -1 とすることもでき、ここに選択の余地があります。  
同様に `7 % -3` や `-7 % -3` も統一的に扱えるようにするやり方がいくつかあり、言語によってやり方が異なっています。


CC BY-SA 4.0
2020-05-03T06:25:48.617
66238
2020-05-03T13:05:55.200
2020-05-03T13:05:55.200
19110
19110
66236
answer


理由は「そういう仕様に決めたから」です。仕様：整数の除算は負の無限大方向への丸めとする。  
<https://docs.python.org/ja/3/library/stdtypes.html> の (2)

また `(x//y)*y + (x%y) = x` にならないと不都合が生じるので剰余のほうも必然的に決まります。

この挙動は他の言語たとえば [c](/questions/tagged/c "'c' のタグが付いた質問を表示") や
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示")
とは異なりますし、一般的な日本人が中学校で教わる負の数の乗除算とも異なりますが、そもそも負の数の除算は自分の都合の良いように定義してよい
[除法](https://ja.wikipedia.org/wiki/%E9%99%A4%E6%B3%95) ので
[python](/questions/tagged/python "'python' のタグが付いた質問を表示")
ではこう決めたってことで了承してください。

# なぜそう決めたのかの rationale はオイラも知りたい。


CC BY-SA 4.0
2020-05-03T06:42:55.713
66239
2020-05-03T06:42:55.713
8589
66236
answer