2016-11-19 6 views
0

Wikipediaによると、modulo operator(整数除算の残余)は、0n-1の間の結果をもたらすはずです。Javascriptモジュロ演算子は他の言語とは異なる動作をします

これは確かにpythonの場合である:

Ruby
print(-1%5) # outputs 4 

Haskell

main = putStrLn $ show $ mod (-1) 5 

しかしJavascript中で

puts -1%5 # outputs 4 

console.log(-1%5); 

結果は-1です!

なぜですか?この意思決定の背後には論理がありますか?

-14モジュロ5に相当しますが、負の値を指定するとインデックスとして使用するのが難しくなります。例えば

:配列の長さを超える5ですが、Javascriptでは、これが起こるのを待っている例外のとき

arr[x%5] 

は常にpythonRubyで有効な式になります。

+0

あなたはウィキペディアを参照し、まだそれは明らかに、AまたはNのいずれかが負の場合には、素朴な定義が壊れるとプログラミング言語は、それは言語があなたのようにそれに違反しているprogamming好きではないですので、これらの値はdefined.'方法が異なり '述べてまた主張する。 – vlaz

+0

これが当てはまることは明らかですが、その理由は何ですか? –

+0

また、JS内で 'arr [x%5]'が ''例外が発生するのを待っているのは見えません - 負の数を渡すと負の結果が出ますので '' undefined ' 。演算子が実際にPythonのように動作した場合、配列から_random_要素が得られます。だから、あなたはバグを抱えていて、後でそれが見つかることはありません。 – vlaz

答えて

2

「モジュラス」であなたは数学のように一般的なユークリッド除算の余りを理解していれば、% operatorはモジュロ演算子ではありません。むしろ剰余演算子と呼ばれ、結果は常に被除数と同じ符号を持ちます。 (ハスケルでは、rem functionがこれを行います)。

この動作では、JavaScriptの算術規則が触発されたから、CとJavaで、特にも、プログラミング言語の中ではかなり一般的です。

関連する問題