取模和取余的区别以及 JS 中的取模运算问题

取模 VS 取余

取模运算(Modulo Operation)属于计算机术语,运算符为%。取余运算(Complementation )就是平常数学运算中的求余数。它们两个概念有重叠的部分但又不完全一致。

先来看看除法运算中求余数的整个过程,a、b、c 和 d 分别为被除数、除数、商和被除数。

  1. 求商:c = a / b;
  2. 求模或者余数:r = a - c * b;

取模和取余的区别体现在第一步:取余运算在求 c 时,向 0 方向舍弃小数位;取模运算则向-∞方向舍弃小数位。所以,当a 和 b 中其一为负数时,取模和取余的运算结果就不同了。例如:

9 / (-4) = -2.25

取余运算就会把 c 取做 -2 ,运算结果为 1;取模运算则把 c 取做 -3,运算结果为 -3;

JS 中的%

一般来讲,计算机语言中的%运算符代表的都是取模运算,然而在 JavaScript 中,%代表的是取余运算。

node 环境下的 % 运算和 python 环境下的 % 运算

所以,在写 JS 时遇到这个问题不要慌,这不是个 bug,而是个 feature……

在 JS 中进行取模运算:

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

参考资料:

  1. Stackoverflow:javascript-modulo-not-behaving
Show Comments