在JavaScript中,%运算符似乎表现得非常奇怪。我尝试了以下方法:
>>> (0 - 11) % 12
-11
为什么它返回-11而不是1(如在Python中)?
我确信我正在做或期待出错,但文档并没有告诉我什么。
答案 0 :(得分:7)
根据语言的指定方式(例如ECMA 262),它的行为正确,它被称为余数运算符而不是模运算符。来自规范:
ECMAScript浮点余数运算的结果由IEEE算法规则确定:
- 如果任一操作数为NaN,则结果为NaN。
- 结果的符号等于股息的符号。
- 如果被除数是无穷大,或除数是零或两者,则结果为NaN。
- 如果被除数是有限的且除数是无穷大,则结果等于被除数。
- 如果被除数为零且除数为非零且有限,则结果与该除数相同 股利。
- 在其余的情况下,无论是无穷大,也不是零,也不涉及NaN, 被除数
r
和除数n
的浮点余数d
由数学定义 关系r = n - (d * q)
其中q
是一个整数,仅当n/d
为负时才为负数 仅当n/d
为正数且且其大小尽可能大时才为正数 超过n
和d
的真实数学商的大小。计算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)
>>> from math import *
>>> fmod(-11, 12)
-11.0
-11是正确答案..