2016-11-19 46 views
0

根据维基百科的说法,modulo operator(整数除法的其余部分)应在0n-1之间产生一个结果。Javascript modulo operator与其他语言的行为不同

这确实是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等于45,负值使得它很难用作索引。

例如:

arr[x%5] 

将总是在pythonRuby有效的表达式当阵列长度大于5,但在Javascript,这是等待发生异常。

+0

您参考维基百科,但它明确规定'当任一或n是负的,天真的定义分解和编程语言中这些值是如何defined.'不同,因此它不喜欢预设电台语言违反了它,你还声称。 – vlaz

+0

很明显,情况就是这样,问题是为什么? –

+0

另外我不明白'arr [x%5]'是JS中的一个等待发生的异常 - 如果你传递一个负数,你会得到一个负面的结果,所以你会得到'undefined' 。如果操作符确实像Python或其他任何工作,那么它会给你一个数组中的_random_元素。所以你可能有一个bug,直到后来才找到它,因为它看起来像它的作品。 – vlaz

回答

2

如果通过“模数”理解数学中常见的欧几里得除法的余数,则% operator不是模运算符。它被称为剩余运算符,其结果始终与股息具有相同的符号。 (在Haskell中,rem function这样做)。

这种行为在编程语言中很常见,特别是在C和Java中,JavaScript的算术惯例受到启发。