3

在 JavaScript 中,% 操作符的行为似乎很奇怪。我尝试了以下方法:

>>> (0 - 11) % 12
-11

为什么它返回 -11 而不是 1(如在 Python 中)?

我确定我正在做错事或期待错事,但文档并没有告诉我是什么。

4

5 回答 5

7

根据指定语言的方式(例如ECMA 262),它的行为正确,它被称为余数运算符而不是模数运算符。从规范:

ECMAScript 浮点余数运算的结果由 IEEE 算术规则确定:

  • 如果任一操作数为 NaN,则结果为 NaN。
  • 结果的符号等于被除数的符号。
  • 如果被除数为无穷大,或除数为零,或两者兼而有之,则结果为 NaN。
  • 如果被除数是有限的且除数是无穷大,则结果等于被除数。
  • 如果被除数为零且除数为非零且有限,则结果与被除数相同。
  • r在其余情况下,既不涉及无穷大,也不涉及零,也不涉及 NaN,被除数n和除数的浮点余数d由数学关系定义,r = n - (d * q)其中q是一个整数,只有当n/d是负数和正数时才是负数ifn/d是正的,并且其幅度尽可能大,但不超过 和 的真数学商的n幅度dr使用 IEEE 754 舍入到最近模式计算并舍入到最接近的可表示值。

在你的情况下n/d是负面的,所以结果是负面的。

有关更多详细信息,请参阅有关模数的 Wikipedia 条目,包括具有结果符号行为的语言列表。

于 2009-01-17T11:49:59.787 回答
1

有两种类似的运算:取模和取余。模表示更多的数学用法,其余更多的 IT 用法。

假设我们有两个整数,a 和 b。

MOD(a, b) 将返回与 b 具有相同符号的结果。

REM(a, b) 将返回一个与 a 符号相同的结果。- 这就是在 C/C++/C# 中作为 % 运算符实现的内容,并且经常被混淆地称为“mod”

你也可以这样想:

MOD(a, b) 将找到小于 a 的 b(称为“c”)的最大整数倍,并返回 (a - c)。

例如 MOD(-340,60) 我们发现 c = -360 是小于 -340 的 60 的最大倍数。所以我们做 (-340 - (-360)) = 20。

REM(a, b) 将返回一个值,使得 (DIV(a,b) * b) + REM(a, b) = a,其中 DIV() 表示整数除法。

所以对于 r = REM(-340, 60)

-340 = DIV(-340,60) * 60 + r = -5 * 60 + r = r - 300

这解决了给我们 r = -40。

于 2009-06-09T19:16:59.427 回答
0

-11 < 12,所以我“假设”它们实际上并没有除:所以 -11 = 0x12 -11

试试 (0-13) % 12

于 2009-01-17T11:52:33.400 回答
0

你说 MOD(a,b) 将返回一个与 b 符号相同的结果,但然后说它返回 (ac),其中 c 小于 a。第二个定义意味着它总是返回一个正数。它是哪一个?

于 2009-06-30T20:50:17.470 回答
-1

数学模块中的 fmod 在 python 中的行为正确:

>>> from math import *
>>> fmod(-11, 12)
-11.0

-11 是正确答案..

于 2009-01-17T11:54:52.537 回答