チャポケのブログ

勉強したことをまとめておく。

python 割り算に関する演算子 a//b, a%b, a/b

a//b, a%b, a/b の比較

整数÷整数は、"/"の演算子割り算すると実数になる。
"/"の代わりに"//"の演算子を使うと、整数切り捨て除算になる。
"%"の演算子は、整数切り捨て除算の余りが求まる。

マイナス値を整数除算する場合、整数への丸め方は言語によって異なるので注意。
pythonでは小さくなるように丸める。

b = 4
print("*** a//b, a%b, a/b の比較 ***")
for a in range(9, -10, -1):
    print("{0}//{1}={2},  {0}%{1}={3},  {0}/{1}={4}".format(a, b, a//b, a%b, a/b))

上記を実行すると、次のようになる。

*** a//b, a%b, a/b の比較 ***
9//4=2,  9%4=1,  9/4=2.25
8//4=2,  8%4=0,  8/4=2.0
7//4=1,  7%4=3,  7/4=1.75
6//4=1,  6%4=2,  6/4=1.5
5//4=1,  5%4=1,  5/4=1.25
4//4=1,  4%4=0,  4/4=1.0
3//4=0,  3%4=3,  3/4=0.75
2//4=0,  2%4=2,  2/4=0.5
1//4=0,  1%4=1,  1/4=0.25
0//4=0,  0%4=0,  0/4=0.0
-1//4=-1,  -1%4=3,  -1/4=-0.25
-2//4=-1,  -2%4=2,  -2/4=-0.5
-3//4=-1,  -3%4=1,  -3/4=-0.75
-4//4=-1,  -4%4=0,  -4/4=-1.0
-5//4=-2,  -5%4=3,  -5/4=-1.25
-6//4=-2,  -6%4=2,  -6/4=-1.5
-7//4=-2,  -7%4=1,  -7/4=-1.75
-8//4=-2,  -8%4=0,  -8/4=-2.0
-9//4=-3,  -9%4=3,  -9/4=-2.25

divmod()関数

divmod()を使うと、
"//"の演算子で求まる整数除算と、
"%"の演算子で求まる余りを、同時に算出できる。

b = 4
print("*** a//b, a%b, a/b, divmod() の比較 ***")
for a in range(9, -10, -1):
    q, mod = divmod(a, b)
    print("{0}//{1}={2}={5},  {0}%{1}={3}={6},  {0}/{1}={4}".format(a, b, a//b, a%b, a/b, q, mod))

上記を実行すると、次のようになる。

*** a//b, a%b, a/b, divmod() の比較 ***
9//4=2=2,  9%4=1=1,  9/4=2.25
8//4=2=2,  8%4=0=0,  8/4=2.0
7//4=1=1,  7%4=3=3,  7/4=1.75
6//4=1=1,  6%4=2=2,  6/4=1.5
5//4=1=1,  5%4=1=1,  5/4=1.25
4//4=1=1,  4%4=0=0,  4/4=1.0
3//4=0=0,  3%4=3=3,  3/4=0.75
2//4=0=0,  2%4=2=2,  2/4=0.5
1//4=0=0,  1%4=1=1,  1/4=0.25
0//4=0=0,  0%4=0=0,  0/4=0.0
-1//4=-1=-1,  -1%4=3=3,  -1/4=-0.25
-2//4=-1=-1,  -2%4=2=2,  -2/4=-0.5
-3//4=-1=-1,  -3%4=1=1,  -3/4=-0.75
-4//4=-1=-1,  -4%4=0=0,  -4/4=-1.0
-5//4=-2=-2,  -5%4=3=3,  -5/4=-1.25
-6//4=-2=-2,  -6%4=2=2,  -6/4=-1.5
-7//4=-2=-2,  -7%4=1=1,  -7/4=-1.75
-8//4=-2=-2,  -8%4=0=0,  -8/4=-2.0
-9//4=-3=-3,  -9%4=3=3,  -9/4=-2.25

a//b と int(a/b) の比較

"a//b" の丸め方は小数点以下を値の小さい方に丸めて整数にするが、
"int(a/b)" の丸め方は小数点以下を値の小さい方ではなく、
絶対値の小さい方に丸めて整数にする。
従って、a//b ≠ int(a/b) となる場合があるので注意が必要。

b = 4
print("*** a//b, int(a/b) の比較 ***")
for a in range(9, -10, -1):
    print("{0}//{1}={2},  int({0}/{1})=int({3})={4}".format(a, b, a//b, a/b, int(a/b)))

上記を実行すると、次のようになる。

*** a//b, int(a/b) の比較 ***
9//4=2,  int(9/4)=int(2.25)=2
8//4=2,  int(8/4)=int(2.0)=2
7//4=1,  int(7/4)=int(1.75)=1
6//4=1,  int(6/4)=int(1.5)=1
5//4=1,  int(5/4)=int(1.25)=1
4//4=1,  int(4/4)=int(1.0)=1
3//4=0,  int(3/4)=int(0.75)=0
2//4=0,  int(2/4)=int(0.5)=0
1//4=0,  int(1/4)=int(0.25)=0
0//4=0,  int(0/4)=int(0.0)=0
-1//4=-1,  int(-1/4)=int(-0.25)=0
-2//4=-1,  int(-2/4)=int(-0.5)=0
-3//4=-1,  int(-3/4)=int(-0.75)=0
-4//4=-1,  int(-4/4)=int(-1.0)=-1
-5//4=-2,  int(-5/4)=int(-1.25)=-1
-6//4=-2,  int(-6/4)=int(-1.5)=-1
-7//4=-2,  int(-7/4)=int(-1.75)=-1
-8//4=-2,  int(-8/4)=int(-2.0)=-2
-9//4=-3,  int(-9/4)=int(-2.25)=-2