-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年之前的时间,则“截断为零”规则将得出毫无意义的结果!使用下限规则,一切正常。
今天(再次)被要求解释为什么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年之前的时间,则“截断为零”规则将得出毫无意义的结果!使用下限规则,一切正常。