Python 2.x 中的除法 [重复]
Posted
技术标签:
【中文标题】Python 2.x 中的除法 [重复]【英文标题】:Division in Python 2.x [duplicate] 【发布时间】:2017-05-29 06:09:14 【问题描述】:在Python 2.x中,整数除法7/3应该输出-2,对吧?原因:由于分子和分母都是整数,所以进行除法并截断小数点后的数字。所以在这个案子, -7/3=-2.3333333....所以,python 应该输出 -2。但它给出输出 -3。谁能解释一下原因?
【问题讨论】:
来自docs:“结果是数学除法,结果应用了‘floor’函数” 顺便说一句,我建议您始终使用//
运算符进行整数除法,因为它的含义在 Python 版本中是明确的,并且不关心 from __future__ import division
是否到位。
【参考方案1】:
"并且小数点后的数字被截断"
没有。这并不完全正确。 Python 2.x 实现了整数的地板除法(//
是 python2.x 和 python3.x 中的地板除法)。对于正数,这与截断小数点后的数字相同。但是,对于负数,您会得到不同的结果(如您所见)。
请注意,这与使用C
(例如)可能得到的行为不同。 Guido 在this blog post
整数除法运算 (//) 和它的兄弟,模运算 (%),一起满足一个很好的数学关系(所有变量都是整数):
a/b = q 余数为 r
这样
b*q + r = a 和 0
(假设 a 和 b >= 0)。
如果你想让关系扩展为负a(保持b为正),你有两种选择:如果你将q向零截断,r将变为负数,这样不变量变为0
在数学数论中,数学家总是更喜欢后一种选择...
【讨论】:
很好的解释 所以,基本上 Python 整数除法是正常的(我们在数学中所做的)整数除法的底函数,对吧?这就是为什么答案(底函数(-2.333...)=-3 ) 是 -3.... @explorer -- 是的。在python术语中,有“真除法”和“底除法”,其中“底除法”是应用于真除法结果的底函数。在 python2.x 中,整数实现了“地板除法”。在 python3.x 中发生了变化,恢复“地板除法”行为的最佳方法是使用地板除法运算符 (//
)。
我没有提到您也可以(并且应该)在 python2.x 代码中使用地板除法运算符。 :-)【参考方案2】:
重要的是要意识到-7/3
被解析为(-7)/3
而不是-(7/3)
,因此其他答案中解释的地板除法规则导致商评估为-3
。
【讨论】:
【参考方案3】:>>> 7/2
3
>>> -7/2
-4
>>> 7/3
2
>>> -7/3
-3
>>>
除法后得到底值,因此负数 -3 是底值,-2 是 ceil 值,因为 -3
【讨论】:
【参考方案4】:我猜 Python 2.7 会自动给出下限值。
你可以import numpy
然后做一个np.ceil(-7/3)
【讨论】:
在 Python 2 中,np.ceil(-7/3)
将是 -3.0
,我怀疑这是您想要的。 (顺便说一句,当math
模块已经有ceil
函数时,为什么要在此处导入numpy?)
是的,我交叉检查了np.ceil(-7/3)
确实给出了-3,但数学模块中的 ceil 函数也是如此。我只是使用 numpy,因为我已经习惯了。顺便说一句,你能解释一下为什么ceil(-7/3)
和floor(-7/3)
都给出-3作为答案。
好吧,正如 OP 已经观察到的那样,-7/3
是 -3
,所以 ceil(-7/3)
是 ceil(-3)
(函数的参数在传递给函数之前被评估)。跨度>
谢谢你的解释以上是关于Python 2.x 中的除法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章