Python 3.2中的截断除法
在Python 3.2中,整数的地板除法
//
比浮点数除法/
更快吗?如果我知道我只会处理整数,是否应该优先使用//
而不是默认的/
?在Python 3.2中,如何实现整数截断的行为?
1/2 = 0
-1/2 = 0
谢谢。
2 个回答
2
这是我经过一些尝试和错误后得到的关于截断除法的代码。这段代码可以处理任意大的整数。
def truncdiv(num : int, denom : int):
if (num < 0) != (denom < 0):
return -(num // -denom)
else:
return num // denom
我在寻找截断的除法和取余(商和余数)时发现了这个。我的代码是类似的:
def truncdivmod(num : int, denom : int):
if (num < 0) != (denom < 0):
q, r = divmod(num, -denom)
return [-q, r]
else:
return divmod(num, denom)
3
from math import (floor, ceil)
def trunc_div(a, b):
c = a / b
return floor(c) if c > 0 else ceil(c)
测试一下,确保它是对的。现在很晚了,我在困的时候做数学题。
其实,不要这么做。在我尝试把整数(int)进行子类化以实现截断除法的时候(也别这么做(而且,这也没成功)),我突然想到,int()
本身就会把小数截断,结果是这样的:
def trunc_div(a, b):
return int(a / b)
这其实是个相当愚蠢的包装。
所以,直接使用浮点数除法,然后用 int()
来截断它:
>>> int(1 / 2)
0
>>> int(-1 / 2)
0
这样就能接近你想要的中缀表示法了。
这个故事的教训是……不要让你的朋友在困的时候写代码。