整数除以负数

时间:2013-10-22 12:26:35

标签: python ruby math

整数除法-1/5应该返回什么?我完全被这种行为搞糊涂了。我认为它应该是0,但是python和ruby返回-1。

为什么不同语言的表现方式不同?请有人解释一下。感谢。

| Language  | Code           | Result |
|-----------+----------------+--------|
| ruby      | -1 / 5         |     -1 |
| python    | -1 / 5         |     -1 |
| c         | -1 / 5         |      0 |
| clojure   | (int (/ -1 5)) |      0 |
| emacslisp | (/ -1 5)       |      0 |
| bash      | expr -1 / 5    |      0 |

2 个答案:

答案 0 :(得分:35)

简答:语言设计师可以选择在进行整数除法时,他们的语言是否会向零,负无穷大或正无穷大舍入。不同的语言做出了不同的选择。

长期回答: Python和Ruby的语言作者都认为向负无穷大舍入比向零舍入更有意义(就像C一样)。 python的创建者写了一篇关于他的推理here的博客文章。我在下面摘录了很多内容。

  

我今天(再次)被要求解释为什么Python中的整数除法返回结果的底限而不是像C那样截断为零。

     

对于正数,毫不奇怪:

>>> 5//2
2
     

但是如果其中一个操作数是负数,则结果会被消除,即从零(向负无穷大)四舍五入:

>>> -5//2
-3
>>> 5//-2
-3
     

这扰乱了一些人,但有一个很好的数学原因。   整数除法运算(//)及其兄弟,模数   操作(%),一起去满足一个很好的数学   关系(所有变量都是整数):

a/b = q with remainder r
     

这样

b*q + r = a and 0 <= r < b
(assuming a and b are >= 0).
     

如果你想让关系扩展为负数a(保持b   积极的),你有两个选择:如果你将q截断为零,r   将变为负数,使得不变量变为0&lt; = abs(r)&lt;   否则,你可以将q置于负无穷大,而且   不变量保持为0&lt; = r&lt;湾[更新:修正此段]

     

在数学数论中,数学家总是喜欢后者   选择(参见例如Wikipedia)。对于Python,我做了同样的选择   因为模数有一些有趣的应用   操作,其中a的标志是无趣的。考虑一下   POSIX时间戳(自1970年开始以来的秒数)并将其转换为   一天中的时间。由于一天有24 * 3600 = 86400秒,   这个计算只是t%86400.但如果我们要表达时间   在1970年之前使用负数,“截断为零”规则   会产生毫无意义的结果!使用最低限额规则一切顺利   细

答案 1 :(得分:4)

整数除法是特定于实现的。来自维基百科的Modulo operation

许多实现使用截断除法,其中商由truncation q = trunc( a / n}定义),换句话说,它是精确理性商在0方向上的第一个整数,余数由 r = a - n q 。非正式地说,商是“向零舍入”,因此余数与被除数具有相同的符号。

Knuth描述 floored division ,其中商由floor function q = floor( a / n )其余 r

r = a - nq = a - n \left\lfloor {a \over n} \right\rfloor.

这里的商总是向下舍入(即使它已经是负数),余数与除数的符号相同。