Comment calculer modulo d'entiers négatifs en JavaScript?

j'essaie d'itérer sur un tableau d'objets jQuery, en incrémentant ou décrémentant par 1. Donc, pour la partie décrémentant, j'utilise ce code:

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

j'ai donc 4 éléments avec id:

div_0
div_1
div_2
div_3

je m'attendais à itérer comme 3 - 2 - 1 - 0 - 3 - 2 - etc..

mais il retourne -1 après le zéro, donc il est coincé. Ainsi, il est itératif:

3 - 2 - 1 - 0 - -1 - stuck

je sais que je peux probablement le réparer en changeant le deuxième ligne de mon code

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

mais je me demande pourquoi JavaScript ne calcule pas des mods négatifs. Ça aidera peut-être un autre codeur.

16
demandé sur ProgramFOX 2013-09-04 19:37:42

2 réponses

Vous pouvez essayer ceci :p-

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

découvrez

29
répondu Rahul Tripathi 2015-11-07 02:47:47

la plupart des langues héritées de C retourneront un résultat négatif si le premier opérande d'une opération modulo est négatif et le second est positif. Je ne sais pas pourquoi cette décision a été prise à l'origine. Probablement plus proche de ce que les processeurs de l'époque faisaient en assemblage. En tout cas, depuis lors, la réponse à "pourquoi" est probablement", car c'est ce que les programmeurs qui connaissent C attendre".

référence MDC contient un pointeur vers une proposition visant à introduire un approprié mod opérateur. Mais même cela maintiendrait l'existant!--0 -- > opérateur (qu'ils appellent "reste" pour mieux les distinguer) et introduire une nouvelle notation infix word a mod b. La proposition date de 2011, et je ne connais pas de développements plus récents dans cette direction.

13
répondu MvG 2013-09-04 16:25:09