在 JavaScript 中,% 操作符的行为似乎很奇怪。我尝试了以下方法:
>>> (0 - 11) % 12
-11
为什么它返回 -11 而不是 1(如在 Python 中)?
我确定我正在做错事或期待错事,但文档并没有告诉我是什么。
在 JavaScript 中,% 操作符的行为似乎很奇怪。我尝试了以下方法:
>>> (0 - 11) % 12
-11
为什么它返回 -11 而不是 1(如在 Python 中)?
我确定我正在做错事或期待错事,但文档并没有告诉我是什么。
根据指定语言的方式(例如ECMA 262),它的行为正确,它被称为余数运算符而不是模数运算符。从规范:
ECMAScript 浮点余数运算的结果由 IEEE 算术规则确定:
- 如果任一操作数为 NaN,则结果为 NaN。
- 结果的符号等于被除数的符号。
- 如果被除数为无穷大,或除数为零,或两者兼而有之,则结果为 NaN。
- 如果被除数是有限的且除数是无穷大,则结果等于被除数。
- 如果被除数为零且除数为非零且有限,则结果与被除数相同。
r
在其余情况下,既不涉及无穷大,也不涉及零,也不涉及 NaN,被除数n
和除数的浮点余数d
由数学关系定义,r = n - (d * q)
其中q
是一个整数,只有当n/d
是负数和正数时才是负数ifn/d
是正的,并且其幅度尽可能大,但不超过 和 的真数学商的n
幅度d
。r
使用 IEEE 754 舍入到最近模式计算并舍入到最接近的可表示值。
在你的情况下n/d
是负面的,所以结果是负面的。
有关更多详细信息,请参阅有关模数的 Wikipedia 条目,包括具有结果符号行为的语言列表。
有两种类似的运算:取模和取余。模表示更多的数学用法,其余更多的 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。
-11 < 12,所以我“假设”它们实际上并没有除:所以 -11 = 0x12 -11
试试 (0-13) % 12
你说 MOD(a,b) 将返回一个与 b 符号相同的结果,但然后说它返回 (ac),其中 c 小于 a。第二个定义意味着它总是返回一个正数。它是哪一个?
数学模块中的 fmod 在 python 中的行为正确:
>>> from math import *
>>> fmod(-11, 12)
-11.0
-11 是正确答案..