2016-11-19 49 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的算術慣例受到啓發。