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

date
Oct 12, 2017
slug
quyu-qumo
status
Published
tags
JavaScript
summary
type
Post

取模 VS 取余

取模运算(Modulo Operation)属于计算机术语,运算符为%。取余运算(Complementation )就是平常数学运算中的求余数。它们两个概念有重叠的部分但又不完全一致。
先来看看除法运算中求余数的整个过程,a、b、c 和 d 分别为被除数、除数、商和被除数。
  1. 求商:c = a / b;
  1. 求模或者余数:r = a - c * b;
取模和取余的区别体现在第一步:取余运算在求 c 时,向 0 方向舍弃小数位;取模运算则向-∞方向舍弃小数位。所以,当a 和 b 中其一为负数时,取模和取余的运算结果就不同了。例如:
9 / (-4) = -2.25
取余运算就会把 c 取做 -2 ,运算结果为 1;取模运算则把 c 取做 -3,运算结果为 -3;

JS 中的%

一般来讲,计算机语言中的%运算符代表的都是取模运算,然而在 JavaScript 中,%代表的是取余运算。
notion image
所以,在写 JS 时遇到这个问题不要慌,这不是个 bug,而是个 feature……

在 JS 中进行取模运算:

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

参考资料:

  1. Stackoverflow:javascript-modulo-not-behaving

© Sytone 2021