当前位置: 首页 > 面试题库 >

整数除以负数

叶淇
2023-03-14
问题内容

-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年之前的时间,则“截断为零”规则将得出毫无意义的结果!使用下限规则,一切正常。



 类似资料:
  • 我有一项任务,阐述C代码(在x86上运行)的一些看似奇怪的行为。我可以很容易地完成其他一切,但这件事真的让我困惑。 代码段1输出

  • 在这个代码中,-20应该是最小值,因为它是负数,并且离零最远,正确吗?但当我运行MinAlgoritm时,会打印出整数5。我有一个最大版本的这个可以很好地工作,但这个不行。这怎么可能?我能做些什么改进吗?

  • 问题内容: 在我的应用程序中,我遇到了以下问题,并对结果感到惊讶: (两个整数)。 这是什么意思? 问题答案: 对于实际值,即结果为。 您使用整数除法得到的结果将向下舍入为的更负值。(也称为“地板部门”) 这就是为什么您会得到以下令人困惑的答案的原因: 注: 这是在Python 3中,其中的结果,“固定”是。因此,如果您没有理由使用Python 2,则应该升级。;) 在Python 3中,如果仍然

  • 问题内容: 5年前关闭。 我必须将两个整数相除并得到一个浮点数作为我的代码: 我用调试器检查值 为什么结果为0.0?我应该怎么做才能获得正确的浮动? 问题答案: 当您将两个数相除时,将执行整数除法,在这种情况下,将导致22/64 =0。只有完成此操作后,您才能创建一个。和的表示是。如果要执行浮点除法,则应 在 除法 之前进行 强制转换:

  • 我发现了使用Java+Spring+FreeMarker非常有趣的东西 从java控制器中,我将“-1”作为整数值传递。在freemarker模板中,在${value}之后,我不时会得到“1-”而不是“-1”,这种情况时有发生。 知道为什么会这样吗?自由马克虫?

  • 问题内容: 任何数据类型的上限(不包括)总是比下限的绝对值小1。 例如,an的上限为2,147,483,647,ABS(下限)= 2,147,483,648。 是否有理由总是总是比负整数多一个负整数? 编辑:更改,因为问题与数据库不直接相关 问题答案: 您提供的类型是有符号整数。让我们来看一个字节(8位)的示例。使用1字节,您可以使用组合来存储256个可能的数字。 现在,您要具有相同数量的正数和负