根据维基百科,n
上的modulo operator(整数除法的余数)应该会产生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]
当数组长度超过python
时,始终是Ruby
和5
中的有效表达式,但在Javascript
中,这是等待发生的异常
答案 0 :(得分:2)
如果通过“模数”你理解欧几里德分裂的其余部分在数学中是常见的,那么%
operator不是模数运算符。它被称为余数运算符,其结果始终与被除数具有相同的符号。 (在Haskell中,rem
function执行此操作。)
这种行为在编程语言中很常见,特别是在C和Java中,JavaScript的算术惯例受到启发。