Pythonで (-N//2) と (0-N//2) は同じにならない


このエントリーをはてなブックマークに追加

Be careful: (-N//2) and (0-N//2) を見ていて混乱した話です。

問題のコードを実行

まず、上記リンクで話題になっているコードを動かしてみます。

N = 99
print(-N//2)
print(0-N//2)

Python 2またはPython 3で実行すると、以下の結果が出力されます。

-50
-49

つまり、同じ結果になりません。

現象を読み解く

この現象は、単項演算子である'-'と、二項演算子である'-'とで優先順位が異なることが原因で起こっています。

演算子の優先順位 - 数値 - Python入門から、今回の式に関係のある演算子を抜粋すると以下のようになります。

(優先順位が高い)
  -      (-は単項演算子)
  //
  -      (-は二項演算子)
(優先順位が低い)

これをもとに、先ほどのコードの優先順位を明示すると以下のようになります。

print((-N)//2)
print(0-(N//2))

Python//演算子は、除算の結果が整数にならない場合は小さい方の整数に丸めるので、 (-99)//2は-50に、99//2は49に丸められることになります。このことから、冒頭のコードで2式の結果が一致しない理由が分かりました。