Javascript模运算符的行为与其他语言不同

Javascript模运算符的行为与其他语言不同,javascript,division,modulo,Javascript,Division,Modulo,根据维基百科的说法,n上的(整数除法的余数)应该产生一个介于0和n-1之间的结果 这确实是python中的情况: print(-1%5) # outputs 4 在Ruby中: puts -1%5 # outputs 4 在Haskell的 main = putStrLn $ show $ mod (-1) 5 但是在Javascript中: console.log(-1%5); 结果是-1 为什么呢?这个设计决策背后是否有逻辑 虽然-1相当于4模5,但负值使其更难用作索引 例如: ar

根据维基百科的说法,
n
上的(整数除法的余数)应该产生一个介于
0
n-1
之间的结果

这确实是python中的情况:

print(-1%5) # outputs 4
在Ruby中:

puts -1%5 # outputs 4
在Haskell的

main = putStrLn $ show $ mod (-1) 5
但是在
Javascript
中:

console.log(-1%5);
结果是
-1

为什么呢?这个设计决策背后是否有逻辑

虽然
-1
相当于
4
5
,但负值使其更难用作索引

例如:

arr[x%5]
当数组长度大于
5
时,在
python
Ruby
中始终是一个有效的表达式,但在
Javascript
中,这是一个等待发生的异常。

如果通过“模”理解欧几里德除法的剩余部分在数学中是常见的,则不是模运算符。它被称为余数运算符,其结果总是与被除数具有相同的符号。(在哈斯凯尔,这一点由政府负责)

这种行为在编程语言中非常常见,尤其是在C和Java中,JavaScript的算术约定就是从这两种语言中产生的。

如果通过“模”理解欧几里德除法的剩余部分在数学中很常见,则不是模运算符。它被称为余数运算符,其结果总是与被除数具有相同的符号。(在哈斯凯尔,这一点由政府负责)


这种行为在编程语言中非常常见,尤其是在C和Java中,JavaScript的算术约定就是从这两种语言中产生的。

您参考了Wikipedia,但它清楚地说明了
当a或n为负时,幼稚的定义出现了问题,编程语言在定义这些值的方式上有所不同。
因此,编程语言并不像您所说的那样违反了它。很明显,情况就是这样,问题是为什么?我也不知道
arr[x%5]是如何定义的
在JS中是一个等待发生的异常
——如果你传入一个负数,你会得到一个负数,因此你会得到
未定义的
。如果操作符确实像python或其他什么东西一样工作,那么它将从数组中给您一个随机元素。所以你可能会有一个bug,直到后来才发现它,因为它似乎是有效的。至于“为什么”是这样的-上次链接到的DUP确实有答案-
%
被视为“给我剩余的”。这似乎就是基本原理。最终结果是
%n
函数在其他语言中应用时具有
n
可能的值(例如
python
ruby
haskell
)但是在
javascript
中,它有
2n-1
可能的值,您可以参考维基百科,但它清楚地指出
当a或n为负时,幼稚的定义出现了问题,编程语言在定义这些值的方式上有所不同。
因此,编程语言并不像您所说的那样违反了它。很明显,情况就是这样,问题是为什么?我也不知道
arr[x%5]是如何定义的
在JS中是一个等待发生的异常——如果你传入一个负数,你会得到一个负数,因此你会得到
未定义的
。如果操作符确实像python或其他什么东西一样工作,那么它将从数组中给您一个随机元素。所以你可能会有一个bug,直到后来才发现它,因为它似乎是有效的。至于“为什么”是这样的-上次链接到的DUP确实有答案-
%
被视为“给我剩余的”。这似乎就是基本原理。最终的结果是
%n
函数在其他语言(例如
python
ruby
haskell
)中应用时具有
n
可能值,但在
javascript
中它具有
2n-1
可能值