如何在JavaScript中计算负整数的模数?

17

我正在尝试迭代一个jQuery对象的数组,通过增加或减少1。因此,对于减少部分,我使用以下代码:

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

所以我有4个带有id的元素:

div_0
div_1
div_2
div_3

我原本期望的迭代顺序是 3 - 2 - 1 - 0 - 3 - 2 - 等等。

但实际上,在 0 后它返回了 -1,因此它被卡住了。所以它的迭代顺序是:

3 - 2 - 1 - 0 - -1 - 卡住了

我知道我可以通过更改代码的第二行来修复它:

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

但我想知道为什么JavaScript不会计算负数的模数。也许这对其他程序员也有帮助。


有几种负模解决方案。https://dev59.com/X3NA5IYBdhLWcg3wH6EW - ryan
1
可能是重复的问题:Javascript取模没有按预期工作 - Vito Gentile
您应该考虑将您接受的答案更改为最后一个,因为它为您提供了所问问题的实际解决方案。 - M -
2个回答

30
你可以尝试这个:p-
Number.prototype.mod = function(n) {
    return ((this % n) + n) % n;
}

看看这里


你能解释一下为什么要进行两次取模吗?我认为(this + n) % n就足够了。 - Marcel
@Marcel 如果模数为360且输入为-710,则您的方法不起作用。 - jjmontes

13
大多数继承自C的编程语言会在模除运算符的第一个操作数为负数且第二个操作数为正数时返回一个负数结果。我不确定最初为什么做出这个决定,可能是因为这样做与当时的处理器在汇编中所做的操作最接近。无论如何,自那以后,“为什么”最有可能的答案是“因为熟悉C的程序员期望如此”。 MDC参考文档包含了指向引入适当的mod运算符提案的链接。但即使这样也会保留现有的%运算符(称之为“余数”以更好地区分它们),并引入一个新的中缀单词符号a mod b。该提案始于2011年,至今没有更多朝着这个方向的最新发展。

我记得 C 语言没有这个问题,但那是很久以前的事了。而且我不知道 JavaScript 是 C 语言的后代 :) 感谢您的回答。 - jeff
1
请参考这张海报了解编程语言的演变细节。维基百科页面列出:“受Self、HyperTalk、AWK、C、Perl、Python、Java、Scheme的影响”。 - MvG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接