整数除法-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 |
Bil*_*nch 39
简短回答:语言设计师可以选择在进行整数除法时,他们的语言是否会向零,负无穷大或正无穷大舍入.不同的语言做出了不同的选择.
答案很长: Python和Ruby的语言作者都认为,向负无穷大四舍五入比向零舍入更有意义(就像C一样).蟒蛇的创作者写了一篇博客文章关于他的推理在这里.我在下面摘录了大部分内容.
今天有人问我(再次)解释为什么Python中的整数除法返回结果的底限而不是像C一样截断到零.
对于正数,毫不奇怪:
Run Code Online (Sandbox Code Playgroud)>>> 5//2 2但是如果其中一个操作数是负数,则结果会被消除,即从零(向负无穷大)舍入:
Run Code Online (Sandbox Code Playgroud)>>> -5//2 -3 >>> 5//-2 -3这会扰乱一些人,但有一个很好的数学原因.整数除法运算(//)及其兄弟,模运算(%),一起使用并满足一个很好的数学关系(所有变量都是整数):
Run Code Online (Sandbox Code Playgroud)a/b = q with remainder r这样的
Run Code Online (Sandbox Code Playgroud)b*q + r = a and 0 <= r < b (assuming a and b are >= 0).如果你想让关系延伸为负a(保持b为正),你有两个选择:如果你将q截断为零,r将变为负数,因此不变量变为0 <= abs(r)<否则,你可以将q置于负无穷大,并且不变量仍为0 <= r <b.[更新:修正此段]
在数学数论中,数学家总是更喜欢后者的选择(参见例如维基百科).对于Python,我做了同样的选择,因为模数运算有一些有趣的应用,其中a的符号是无趣的.考虑采用POSIX时间戳(自1970年初以来的秒数)并将其转换为一天中的时间.由于一天有24*3600 = 86400秒,这个计算只是t%86400.但是如果我们用1970年前的时间表示使用负数,那么"截断为零"规则会产生毫无意义的结果!使用楼层规则一切都很好.