【发布时间】:2021-12-03 13:33:11
【问题描述】:
我正在研究如何在没有math 模块的情况下进行地板/天花板操作。我通过使用地板除法// 解决了这个问题,并发现负数“给出了天花板”。所以这行得通:
>>> 3//2
1
>>> -3//2
-2
我希望答案是肯定的,所以首先我尝试了--3//2,但这给出了 1。我推断这是因为 Python 将 -- 评估为 +。所以为了解决这个问题,我发现我可以使用-(-3//2)),问题解决了。
但是我找到了另一个解决方案,即(我将前面的示例用于比较):
>>> --3//2 # Does not give ceiling
1
>>> 0--3//2 # Does give ceiling
2
我无法解释为什么包含 0 会有所帮助。我已阅读有关部门的文档,但在那里没有找到任何帮助。我认为可能是因为评估顺序:
如果我以--3//2 为例,从文档中我知道Positive, negative, bitwise NOT 在此示例中是最严格的,我猜这会将-- 评估为+。接下来是Multiplication, division, remainder,所以我猜这是+3//2,其计算结果为1,我们就完成了。我无法从文档中推断出为什么包含 0 会改变结果。
参考资料:
【问题讨论】:
-
-3//2给-2 是仍然给你发言权; floor(x)是小于x的最大整数,-2是小于-1.5的最大整数。
-
@Hearth 你是对的,但问题的“精神”是寻求 1.5 的上限,而不是 -1.5。但我知道这是不精确的。
-
@chepner 我相信他们的意思是他们想用这个操作作为一种迂回的方式来做正数的上限。所以他们不期望
-3//2是积极的,他们希望以一种可以有效使用math.ceil(3/2)的方式将结果始终转换为积极的。 -
@chepner
-3//2的点只是他们获得3/2的“ceil”的第一步。第二步是将其转换回正/绝对值,这引发了这个问题,因为它没有达到预期的效果。 -
@ttbek:与在地板上添加一个相比,它的优势在于它给出了正确的答案! (例如,如果 a=4,b=2 则
(a // b) +1给出 3 但 ceil(4/2) 为 2。
标签: python operator-precedence