你真的了解Python3中的除法么?
小测验
你能准确算出 以下的答案么?
1 | if __name__ == "__main__": |
答案:
1 | ########## / ########## |
除法中的取整运算
向上取整
向
+∞
方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 2, -5 / -3 = 2, -5 / 3 = -1, 5 / -3 = -1向下取整
向
-∞
方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 1, -5 / -3 = 1, -5 / 3 = -2, 5 / -3 = -2向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中,余数与除数的是同正或者同负的
总结
- Python 中
//
是向下取整的 就回到导致 -3//2 = -2 而不是-1 - Python的
%
运算 由于其向下取整的特性 导致 与C,C++,JAVA 语言 答案不一样