JavaScript的百分号(模运算符)对负数进行运算会得到一个负数结果。

376
根据Google计算器(-13) % 64的结果是51
根据Javascript(请参见JSBin),结果为-13
我该如何解决这个问题?

这可能只是一个优先级问题。你是指 (-13) % 64 还是 -(13 % 64)?个人而言,我会两种情况都加上括号,以增加清晰度。 - Tyler
4
尽管这是一个 JavaScript 问题,但本质上它与“Java 如何对负数进行取模运算?”这个问题非常相似。 - President James K. Polk
24
在 JavaScript 中,根本问题在于百分号(%)不是模运算符,而是余数运算符。JavaScript 中没有模运算符。因此,接受的答案是可行的方法。 - Redu
3
你是想修复哪个,Google 还是 JS? - Arnaud
6
为什么几乎没有语言实现取模操作,考虑到它是多么有用? - Arnaud
13个回答

1

有一个 NPM 包可以为您完成这项工作。您可以使用以下命令安装它。

npm install just-modulo --save

使用方法从 README 复制

import modulo from 'just-modulo';

modulo(7, 5); // 2
modulo(17, 23); // 17
modulo(16.2, 3.8); // 17
modulo(5.8, 3.4); //2.4
modulo(4, 0); // 4
modulo(-7, 5); // 3
modulo(-2, 15); // 13
modulo(-5.8, 3.4); // 1
modulo(12, -1); // NaN
modulo(-3, -8); // NaN
modulo(12, 'apple'); // NaN
modulo('bee', 9); // NaN
modulo(null, undefined); // NaN

GitHub存储库可以通过以下链接找到:

https://github.com/angus-c/just/tree/master/packages/number-modulo


1
我处理负数 a 和负数 n。
 //best perf, hard to read
   function modul3(a,n){
        r = a/n | 0 ;
        if(a < 0){ 
            r += n < 0 ? 1 : -1
        }
        return a - n * r 
    }
    // shorter code
    function modul(a,n){
        return  a%n + (a < 0 && Math.abs(n)); 
    }

    //beetween perf and small code
    function modul(a,n){
        return a - n * Math[n > 0 ? 'floor' : 'ceil'](a/n); 
    }

0

为了好玩,这里有一个“wrap”函数,它的工作方式有点像模运算,但你也可以指定范围的最小值(而不是0):

const wrap = (value = 0, min = 0, max = 10) =>
  ((((value - min) % (max - min)) + (max - min)) % (max - min)) + min;

基本上只需要使用true模数公式,并对其进行偏移,使得min最终为0,之后再加回min

如果您有一个希望保持在两个值之间的值,则此方法很有用。


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