关于模运算符和Math.floor函数的说明

时间:2017-12-05 16:42:43

标签: javascript function modulo

我有两个功能:

function getDigitsSum(number) {
  var sum = 0;

  while (number > 0) {

    sum += number % 10;
    number = Math.floor(number / 10);
  }

  return sum; 
}


function findNumbers() {

   var results = [];

   for (var i = 1; i <= 100; i++) {
      if (getDigitsSum(i) == 8) {
        results.push(i);
      }
   }

   return results;
}

基本上我显示从1到100的数字,其数字总和等于8.我完全理解第二个函数但不是第一个函数。

我不明白:

while (number > 0) {

    sum += number % 10;
    number = Math.floor(number / 10);
  }

我的问题是:

  1. 模块运算符在这部分代码中的作用是什么?我总是认为它只返回当一个操作数除以第二个操作数时剩余的余数。在这里它似乎有一个我不知道的不同目的。它为什么做它做什么以及如何做?

  2. 我理解Math.floor函数应该做什么,但不了解(number / 10)关于其余代码的含义。为什么number确切地除以10?

  3. 如果有一个替代代码,当然会得到相同的结果,我很高兴看到它。

2 个答案:

答案 0 :(得分:0)

就像函数的名称所示,它会在数字的所有数字上构建总和。即getDigitsSum(12345) => 15

关于你的第一个问题: 模运算符(在本例中)执行您认为的操作。它将number除以10,其余为返回值。因此,11 % 10为1,12 % 10为2,5 % 3为2。

因此,number % 10会为您提供数字的“最右侧”数字:12345 => 5

你的第二个问题: 将number除以10以切断最右边的数字。这样做了,因此循环中的下一次迭代将在1234而不是12345上运行。

修改: 关于你关于替代品的最后一个问题。有很多。根据您的输入,您可以使用String而不是Number:

function getDigitsSum(number) {
    return ('' + number).split('').reduce(function(sum, digit) {
        return sum + Number(digit);
    }, 0)
}

然而,这是更清晰或更有效的问题,可以讨论。

答案 1 :(得分:0)

x % y(x modulo y)表示您执行整数除法x/y并从x中减去其余部分。

e.g。 17%5 = 2因为int(17/5) = 35*3 = 1517-15 = 2

的想法
while (number > 0) {
    sum += number % 10;
    number = Math.floor(number / 10);
}

是,在每一步中,你得到number / 10的余数,这是数字的最后一位数,然后通过使用{{1}对数字进行整数除法来删除下一步的数字}。你一直这样做,直到数字为0,然后因显而易见的原因停止。