负整数除法令人惊讶的结果

Viv*_*k S 42 python division integer-division

在我的应用程序中,我遇到了以下结果,并对结果感到惊讶:

8/-7=-2 (两个整数).

这意味着什么?

Chr*_*per 48

对于实际值,即8.0/(-7.0)结果是粗略的-1.143.

使用整数除法的结果将向下舍入为更负值-2.(这也被称为"地板部门")

这就是为什么你会得到一些有些令人困惑的答案:

>>> 8/(-7)
-2
>>> 8/7
1
Run Code Online (Sandbox Code Playgroud)

注意:这在Python 3中是"固定的",其结果8/(-7)将是-1.143.因此,如果您没有理由使用Python 2,则应升级.;)

在Python 3中,如果您仍想要整数除法,则可以使用//运算符.这将给你与8/(-7)Python 2中相同的答案.

以下是关于该主题的Python增强建议:PEP 238 - 更改分部操作员

  • 育.那么x/-y!= - (x/y)? (14认同)
  • @Lennart:所以你将-5除以2并得到-3,余数为1."为了解决我们的5 emu债务,我们每人将支付3 emus,你将为我们提供一个emu给我们两个home godspeed".当然,我猜是有道理的. (3认同)
  • @LennartRegebro:对于自然数或实数域内的所有x和y,使用为领域定义的除法运算符,(n + d)/ d =(n/d)+1.Python以这样一种方式定义整数除法,即使n为负数,该有用公理也会成立.即使有些人可能期望整数应该从实数中借用(-n)/ d = - (n/d),这个公理很少有用.当试图从数字中提取数字时,具有"-123 mod 10"的产率7并不是非常有用,但是使其产生-3并不是更好. (3认同)
  • @Ira:是的!他们为python 3改变了这个. (2认同)

小智 11

Python总是对负数除法和正数除法进行"底层划分".

那是

1/10 = 0
1/-10 = -1
Run Code Online (Sandbox Code Playgroud)

但有时我们需要1/-10为0

我发现它可以通过先使用float division然后将结果转换为int来完成,例如

int(float(1)/-10) = 0
Run Code Online (Sandbox Code Playgroud)

这对我来说很好,不需要导入未来的部门或升级到Python 3

希望它可以帮到你〜


And*_*nca 9

要让python自动将整数除法转换为float,可以使用:

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

现在:

8/-7=-1.1428571428571428
Run Code Online (Sandbox Code Playgroud)

此功能不在标准python 2中,不会破坏依赖于整数除法的现有代码.但是,这是python 3的默认行为.