Python 3.2中的截断除法

5 投票
2 回答
10127 浏览
提问于 2025-04-16 14:38
  1. 在Python 3.2中,整数的地板除法 // 比浮点数除法 / 更快吗?如果我知道我只会处理整数,是否应该优先使用 // 而不是默认的 /

  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

这样就能接近你想要的中缀表示法了。

这个故事的教训是……不要让你的朋友在困的时候写代码。

撰写回答