Javascript:没有grokking modulo在行动

时间:2015-06-06 19:03:27

标签: javascript modulo

我理解模数的基本概念:它给你剩下的除法。我似乎无法掌握如何在实践中正确使用它。例如,以下代码采用数字,如果它均匀地除以2则返回true,否则返回false:

if(number % 2){
return false;
}
else{
return true;
}

在我看来,直觉(和错误地)你编写代码的方式是设置它以使模数达到0:

if (number/2 %0) {
   return true

任何人都可以解释第一个是正确的吗?请记住,我显然非常密集......

4 个答案:

答案 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;
  }
}