整数除以负数
-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 |
回答:
语言设计者可以选择在进行整数除法时,其语言是四舍五入为零,负无穷大还是正无穷大。不同的语言做出了不同的选择。
Python和Ruby的语言作者都认为向负无穷大舍入比向零四舍五入更有意义(就像C一样)。python的创建者在这里写了一篇有关他的推理的博客文章。我在下面摘录了很多内容。
今天(再次)被要求解释为什么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 <=
abs(r)<否则,您可以将q朝负无穷大移动,并且不变保持0 <= r <b。[更新:解决了此问题]
在数学数论中,数学家总是喜欢后一种选择(例如参见Wikipedia)。对于Python,我做出了相同的选择,因为模运算有一些有趣的应用,其中a的符号没有意义。考虑采用POSIX时间戳(自1970年初以来的秒数),并将其转换为一天中的时间。由于一天中有24
* 3600 =
86400秒,因此该计算仅是t%86400。但是,如果我们使用负数来表示1970年之前的时间,则“截断为零”规则将得出毫无意义的结果!使用下限规则,一切正常。
以上是 整数除以负数 的全部内容, 来源链接: utcz.com/qa/400964.html