一、基础概念
JS中的取余运算符为“%”,它会返回除法运算后的余数。例如10 % 3的结果为1,因为10除以3等于3余1。
除非你是高中刚毕业,否则你应该已经非常熟悉这个运算符了。在实际编程中,取余数常常被用于判断一个数是否为偶数或奇数,例如:
function isEven(num){
return num % 2 === 0;
}
上述代码中,如果num是偶数,返回true,否则返回false。
二、小数的取余
那么,我们有没有想过在JS中,取余数对于小数的处理方式是什么呢?
如果我们输入10.5 % 3,你会期待得到的结果是1.5,但实际上返回的却是1。
这是为什么呢?其实这个结果是由于取余操作是在整数范围内进行的,具体来说,JS引擎会将10.5先转换成10,然后再进行取余数的运算。因此,小数的取余操作并不会直接得出期望的结果。
那么,如果想要求得小数的真正余数怎么办呢?这时候需要用到一些奇技淫巧了:
function getDecimalRemainder(dividend, divisor){
return (dividend % divisor + divisor) % divisor;
}
这个函数将会返回小数的真正余数,例如:
console.log(getDecimalRemainder(10.5, 3)); // 输出1.5
三、负数的取余
下一个我们需要探讨的问题是负数的取余问题。我们知道正数的取余已经足够麻烦了,那么对于负数,它的行为又是怎么样的呢?
如果我们执行-10 % 3,你可能会得到-1、2中的其中一个答案,具体是哪一个完全取决于编程语言和JS引擎的具体实现方式。
在JS中,负数的取余数其实并不是神秘的黑科技,只需要用之前提到的奇技淫巧稍加修改就可以了:
function getNegativeRemainder(dividend, divisor){
return ((dividend % divisor) + divisor) % divisor;
}
这个函数可以返回任何数值的余数,包括负数。例如:
console.log(getNegativeRemainder(-10, 3)); // 输出2
四、性能问题
最后一个问题是关于性能的。虽然我们很少会遇到需要处理小数或负数的取余操作,但是在某些场景下,它们确实是必须的。
我们可以做一些测试来了解在JS中取余数的性能问题,例如:
function testMod(base, mod){
let res = 0;
for(let i = 0; i < 10000000; i++){
res += base % mod;
}
return res;
}
console.time('testMod');
console.log(testMod(10, 3));
console.timeEnd('testMod');
上述代码中,我们对10取余3,然后运行10,000,000次,最后输出结果,并且用console.time函数来计算执行时间。
结果是什么呢?在我的电脑上,输出结果为0(符合预期),执行时间大概为20ms左右。当然,这个数字会随着电脑的性能和浏览器的不同而发生变化。
总之,虽然在某些场景下,取余的性能可能会对整个系统的性能产生比较大的影响,但是在大多数情况下,取余的性能问题并不是我们需要过分关注的。
五、结语
以上就是所有关于JS取余数的详细阐述了。虽然取余数看起来十分基础,但是如果我们对它的实现方式和各种细节不够熟悉,也很容易出现各种奇怪的问题。希望本文能对大家有所帮助!
