我理解模数的基本概念:它给你剩下的除法。我似乎无法掌握如何在实践中正确使用它。例如,以下代码采用数字,如果它均匀地除以2则返回true,否则返回false:
if(number % 2){
return false;
}
else{
return true;
}
在我看来,直觉(和错误地)你编写代码的方式是设置它以使模数达到0:
if (number/2 %0) {
return true
任何人都可以解释第一个是正确的吗?请记住,我显然非常密集......
答案 0 :(得分:2)
要检查数字是否分开而不留下余数,您需要检查模数偏差的结果是否等于零。
if ((number % 2) == 0){
return true; // number was even
} else {
return false; // number was odd
}
答案 1 :(得分:2)
来自mdn % remainder文档:
余数运算符在前面的语句中返回第二个操作数的第一个操作数,即var1 modulo var2,其中var1和var2是变量。模数函数是将var1除以var2的整数余数。
考虑到这一点,以下是使用%
和几个值的结果:
59 % 2
> 1
60 % 2
> 0
0
是javascript中的假值,因此60 %2
的结果永远不会通过您的if
测试。要进行适当的比较,您需要直接检查您是否具有值0
:
if (number % 2 === 0)
return true
答案 2 :(得分:0)
当您使用modulo(%
)运算符时,您基本上是这样说:
number % x
:
将number
除以x
。将结果舍入到最接近的整数。将该整数乘以x
。把这个数字的距离(绝对值)给我原来的number
。
这可能不是模数的确切数学定义,但我想相信它非常接近我们的需要。
举几个例子......
2%2 = 0 (2/2 = 1,1 * 2 = 2,abs(2 - 2)= 0)
3%2 = 1 (3 /2≐1,1* 2 = 2,abs(2 - 3)= 1)
4%2 = 0 (4/2 = 2,2 * 2 = 4,abs(4 - 4)= 0)
您的符号问题在于它是一个需要由程序员执行的额外操作。由于目前我们表达模运算的方式非常简洁,并且不需要我们自己进行任何划分,因此可以在引擎盖下进行性能优化。
为了表达我认为你的意图,你基本上用当前语法计算模数并将其与特定值进行比较:
if (number % 2 === 0)
return true // Yup, its divisible by 2
答案 3 :(得分:0)
在其他答案的基础上,我想提一下,当你已经评估了一个布尔值时,使用if / else
到显式地返回一个布尔值,过分冗长。
如果您在if / else
中所做的只是在任一侧返回一个布尔值,那么您的返回表达式可以减少。
好:
function isEven(num) {
return (num % 2 === 0);
}
function isOdd(num) {
return (num % 2 !== 0);
}
为:
function badIsEven(num) {
if (number % 2 === 0) {
return true;
} else {
return false;
}
}