我正在想如何在没有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
为例,从文档中可以得知,在这个例子中,运算符的严格性排列顺序是:正数、负数、按位取反
,我猜测它将--
评估为+
。其次是乘法、除法、取模
,所以我猜测这是+3 // 2
,它计算为1
,我们完成了。我无法从文档中推断出为什么包括0
会改变结果。
参考资料:
-3//2
是正数,而是希望以一种可以有效地使用math.ceil(3/2)
的方式将结果一致地转换为正数。 - Tyberius(a // b) +1
会得到3,但是ceil(4/2)是2。) - psmears