在JavaScript中使用模数(%)运算符的正确方法是什么?

时间:2009-01-17 11:47:08

标签: javascript modulo

在JavaScript中,%运算符似乎表现得非常奇怪。我尝试了以下方法:

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

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

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

5 个答案:

答案 0 :(得分:7)

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

  

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

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

在您的情况下,n/d为否定,因此结果为否定。

有关详细信息,请参阅Wikipedia entry on modulo,其中包括根据结果符号显示行为的语言列表。

答案 1 :(得分:1)

有两种类似的操作:模数和余数。 Modulo代表了更多的数学用法,其余更多的IT使用。

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

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

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

你也可以这样想:

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

e.g。 MOD(-340,60)我们发现c = -360是60的最大倍数,小于-340。所以我们做(-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。

答案 2 :(得分:0)

-11< 12,所以我想'他们实际上没有分裂: 所以-11 = 0x12 -11

试试(0-13)%12

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

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

-11是正确答案..