【问题标题】:How to calculate modulo of negative integers in JavaScript?如何在 JavaScript 中计算负整数的模?
【发布时间】:2013-09-04 15:37:42
【问题描述】:

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

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 - 等等。

但它在零之后返回 -1,因此它被卡住了。所以它迭代为:

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

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

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

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

【问题讨论】:

标签: javascript jquery math modulo negative-number


【解决方案1】:

你可以试试这个:p-

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

查看this

【讨论】:

  • 你能解释一下为什么你模数两次吗?我认为(this + n) % n 就足够了。
  • @Marcel 如果模数为 360 且输入为 -710,则您的方法将行不通。
【解决方案2】:

如果模运算的第一个操作数是负数而第二个操作数是正数,大多数从 C 继承的语言都将返回负数结果。我不确定为什么最初做出这个决定。可能最接近当时处理器在组装中所做的。无论如何,从那时起,“为什么”的答案很可能是“因为那是懂 C 的程序员所期望的”。

MDC Reference 包含一个指向 a proposal to introduce a proper mod operator 的指针。但即使这样也会保留现有的% 运算符(他们称之为“余数”以更好地区分它们)并引入新的中缀词符号a mod b。该提案始于 2011 年,我不知道这方面的最新进展。

【讨论】:

  • 我记得C没有这个问题,不过是很久以前的事了。而且我不知道 JavaScript 是 C 的后代 :) 感谢您的回答。
  • 参见例如this poster 了解有关编程语言演变的详细信息。 The Wikipedia page 列表:“受 Self、HyperTalk、AWK、C、Perl、Python、Java、Scheme 的影响”。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2013-07-03
  • 2011-07-19
  • 2019-08-17
  • 2021-01-19
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多