取模和取余的区别以及 JS 中的取模运算问题
date
Oct 12, 2017
slug
quyu-qumo
status
Published
tags
JavaScript
summary
type
Post
取模 VS 取余
取模运算(Modulo Operation)属于计算机术语,运算符为
%
。取余运算(Complementation )就是平常数学运算中的求余数。它们两个概念有重叠的部分但又不完全一致。先来看看除法运算中求余数的整个过程,a、b、c 和 d 分别为被除数、除数、商和被除数。
- 求商:c = a / b;
- 求模或者余数:r = a - c * b;
取模和取余的区别体现在第一步:取余运算在求 c 时,向 0 方向舍弃小数位;取模运算则向
-∞
方向舍弃小数位。所以,当a 和 b 中其一为负数时,取模和取余的运算结果就不同了。例如:9 / (-4) = -2.25
取余运算就会把 c 取做 -2 ,运算结果为 1;取模运算则把 c 取做 -3,运算结果为 -3;
JS 中的%
一般来讲,计算机语言中的
%
运算符代表的都是取模运算,然而在 JavaScript 中,%
代表的是取余运算。所以,在写 JS 时遇到这个问题不要慌,这不是个 bug,而是个 feature……
在 JS 中进行取模运算:
Number.prototype.mod = function(n) {
return ((this % n) + n) % n;
}