2013-09-04 10 views
16

私はデクリメント部分は、私はこのコードを使用するので、1ずつ増加または減少させることによって、jQueryのオブジェクトの配列を反復処理しようとしている:JavaScriptで負の整数のモジュロを計算するには?

var splitted_id = currentDiv.attr('id').split('_'); 
var indexOfDivToGo = parseInt(splitted_id[1]); 
indexOfDivToGo = (indexOfDivToGo-1) % allDivs.length; 
var divToGo = allDivs[indexOfDivToGo]; 

ので、私はidを持つ4つの要素があります。

div_0 
div_1 
div_2 
div_3 

私はそれが 3として反復するために期待していた - 2 - 1 - 2 - - 3から0など。

が、それは-1を返し、ゼロの後、したがって、それが立ち往生しています。だから、繰り返し処理など:

3から2 - -1 - - 0から1まで私はおそらく

indexOfDivToGo = (indexOfDivToGo-1 + allDivs.length) % allDivs.length; 

に私のコードの2行を変更して、それを修正するが、私ことができます知っている

を立ち往生なぜJavaScriptが負のモッズを計算していないのだろうか。たぶんこれは別のコーダーの仲間にも役立つでしょう。

+0

いくつかのネガティブな解があります。 http://stackoverflow.com/questions/1082917/mod-of-negative-number-is-melting-my-brain – ryan

+1

[Javascript modulo not behaving]の可能な複製(http://stackoverflow.com/questions/4467539/) javacript-modulo-not-behaving) –

+0

受け入れられた答えを下の方に変更することを検討する必要があります。 – Marquizzo

答えて

29

あなたはこれを試すことができます:P-

Number.prototype.mod = function(n) { 
    return ((this % n) + n) % n; 
} 

チェックアウトthis

+0

モジュロを2倍にする理由を説明できますか?私は '(this + n)%n'で十分だと思います。 – Marcel

13
剰余演算の最初のオペランドが負であり、第二の場合は、負の結果を返しますCから継承

ほとんどの言語ポジティブ。なぜこの決定が元々行われたのか分かりません。おそらく、当時のどのプロセッサが組み立てにあったかに最も近いでしょう。いずれにしても、それ以来、「なぜ」に対する答えは「それはCを知っているプログラマが期待するものなので」最も可能性が高い。

MDC Referenceには、a proposal to introduce a proper mod operatorへのポインタが含まれています。しかし、それでも既存の%演算子(それをよりよく区別するために「残余」と呼ぶ)を保持し、新しい中置詞表記a mod bを導入することになります。この提案は2011年からのものであり、私はこの方向への最近の進展がないことを知っています。

+0

Cはこの問題を抱えていなかったことを覚えていますが、それはずっと前です。私はJavaScriptがCの子孫であることを知らなかった:あなたの答えをありがとう。 – jeff

+1

[このポスター](http://www.digibarn.com/collections/posters/tongues/ComputerLanguagesChart.png)を参照してください。 [ウィキペディアのページ](http://en.wikipedia.org/wiki/ECMAScript)には、「Self、HyperTalk、AWK、C、Perl、Python、Java、Schemeの影響を受ける」というリストがあります。 – MvG

関連する問題