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 中的除法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python中处理长整数除法[重复]

C语言中的除法[重复]

Java中的整数除法[重复]

Java中的整数除法[重复]

python中的除法及常量

python 迭代在除法问题中的数字