0%

你真的懂 Python3的除法么?

你真的了解Python3中的除法么?

小测验

你能准确算出 以下的答案么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if __name__ == "__main__":
print("#" * 10 + " / " + "#" * 10)
print("5/3=", 5 / 3)
print("-5/-3=", - 5 / -3)
print("-5/3=", -5 / 3)
print("5/-3=", 5 / -3)

print("#" * 10 + " // " + "#" * 10)
print("5//3=", 5 // 3)
print("-5//-3=", - 5 // -3)
print("-5//3=", -5 // 3)
print("5//-3=", 5 // -3)

print("#" * 10 + " % " + "#" * 10)
print("5%3=", 5 % 3)
print("-5%-3=", - 5 % -3)
print("-5%3=", -5 % 3)
print("5%-3=", 5 % -3)

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
########## / ##########
5/3= 1.6666666666666667
-5/-3= 1.6666666666666667
-5/3= -1.6666666666666667
5/-3= -1.6666666666666667
########## // ##########
5//3= 1
-5//-3= 1
-5//3= -2
5//-3= -2
########## % ##########
5%3= 2
-5%-3= -2
-5%3= 1
5%-3= -1

除法中的取整运算

  1. 向上取整

    +∞方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 2, -5 / -3 = 2, -5 / 3 = -1, 5 / -3 = -1

  2. 向下取整

    -∞方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 1, -5 / -3 = 1, -5 / 3 = -2, 5 / -3 = -2

  3. 向0取整

    向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,5 / 3 = 1, -5 / -3 = 1, -5 / 3 = -1, 5 / -3 = -1

我们所接触过的C,C++,JAVA 语言取整方式都是向0取整的,而Python是向下取整


取模运算

如果 a/b = q, a%b = r (可表示为a/b=q … r)

在python中,遇到取模运算时,可以先用向下取整的方式算出q,然后结合下面的公式算出r。

那么 a = b*q + r

#当a小于b时(a>0, b>0),r = a,因为这时q = 0

在C语言中,%符号表示的是求余运算。根据C语言中除法结果向零取整的规则,5 % 3 = 2, -5 % -3 = -2, -5 % 3 = -2, 5 % -3 = 2

所以我们对比以下两个表格 :

C语言 JAVA语言 C++下

a b q r
5 3 1 2
-5 -3 1 -2
-5 3 -1 -2
5 -3 -1 2

Python 语言下

a b q r
5 3 1 2
-5 -3 1 -2
-5 3 -2 1
5 -3 -2 -1

注意:最下面两个表格最后两行是不一样的

为什么?

由于 Python采用的是 向下取整 的方法, 并且 要保证 a = b*q + r这个公式的有效性,就会导致 余数不同

我们还会发现,Pyhton中,余数与除数的是同正或者同负的

总结

  1. Python 中// 是向下取整的 就回到导致 -3//2 = -2 而不是-1
  2. Python的 % 运算 由于其向下取整的特性 导致 与C,C++,JAVA 语言 答案不一样