整数除法-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 |
答案 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 是
这里的商总是向下舍入(即使它已经是负数),余数与除数的符号相同。