整数除以负数

-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

回到顶部