“x取模y”的结果是什么?

4
引用ECMAScript规范第5.2节:
“x模y”(y必须是有限且非零的)的表示计算出一个与y相同符号(或零)的值k,使得abs(k)<abs(y),且x-k = q×y,其中q为某个整数。
因此,如果y是正数,则'x模y'的结果k为正数,而不管x的符号如何。
如果我的理解正确,ToInt32(-1)是否等于ToInt32(1)?

1
如果你在谈论数学,那么你是正确的,但是这种语言并不是这样实现的。打开控制台或执行一个节点脚本,尝试使用不同的x和y值进行操作。 - reagan
@reagan 打开控制台或者玩弄一个节点脚本并不能证明什么,因为在JS中没有实现那个部分所描述的模运算符。 - Asad Saeeduddin
ToInt32(-1)不等于 ToInt32(1) - Ted Hopp
3个回答

5
符号“x模y”在规范内部用于描述某些操作的结果。因此,“x模y”的结果k(根据定义)与y具有相同的符号。但并不意味着“%”运算符等同于“模”。如果您感兴趣,实际上关于“%”的规范可以在第11.5.3节中找到。有趣的是,它没有使用“模”。

他们没有问运算符或符号,他们问的是JavaScript对模数运算的解释。 - reagan
我知道在规范内部使用了 x 取模 y。我只想知道 x 取模 y 的含义。例如,'1 取模 10' 和 '-1 取模 10' 的结果是什么? - user1039304
1
@reagan 不完全是。他们问的是“'x模y'的结果k是否无论x的符号如何都为正数”。这是(根据5.2节中模运算的定义)正确的。问题并没有询问任何关于JS对模运算的解释的内容。 - Asad Saeeduddin
模数运算:'1模10' = 1, '-1模10' = 1 Javascript:'1%10' = 1, '-1%10' = -1 - reagan
@user1039304,您可以使用您引用的运算符的定义来计算它。1 modulo 10将为1,因为1 < 10且1-1 = q * 10,其中q为整数0。 - Asad Saeeduddin
显示剩余4条评论

0

从我的先前回答这里:复制粘贴

取模运算:a % b

1. When both +ve, Modulo & Remainder are one and the same
2. When a is -ve, they are not the same

例如; a = -10,b = 3 -10 % 3 的余数为-1 对于模运算,将一个大于等于-a的3的倍数加到'a'上并计算余数。 -10 + 12 = 2 2 % 3 = 2 就是你的答案。

-1

模数运算被定义为数学上的模数运算:

数学运算,如加法、减法、取反、乘法、除法以及本条款后面定义的数学函数,应始终被理解为在数学实数上计算精确的数学结果,不包括无穷大,也不包括与正零有区别的负零。

你的问题:

ToInt32(-1)等于ToInt32(1)

好吧,不是这样的:

让posInt成为sign(number)*floor(abs(number))。

posInt = sign(-1) * floor(abs(-1)) = -1;

令int32bit为posInt模2的32次方;也就是说,它是一个有限的Number类型的整数值k,具有正号且绝对值小于2的32次方,使得posInt和k的数学差是2的32次方的整数倍。
int32bit = posInt mod 4294967296 = -1 mod 4294967296 = 4294967295

(数学结果的 Wolfram Alpha 链接)

如果 int32bit 大于或等于 231,则返回 int32bit - 232,否则返回 int32bit。

因为 4294967295 >= 2147483648,所以我们返回 4294967295 - 4294967296,即 -1

如果我们对 ToInt32(1) 进行相同的步骤,我们得到的是 1。所以它们的结果不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接