使数字成为另一个数字的因素(性能问题)

时间:2016-12-03 15:52:33

标签: javascript math

我有这个有效的JavaScript函数,我想知道是否有更好的方法可以实现相同的结果。

function factorise(number, factor){
    if(factor === 0) return 0;
    return Math.round(number / factor) * factor;
}

现在,如果我希望我发生的随机生成的数字为100可以除以3,我可以使用此函数。

factorise(100, 3); ---> 99

以下是其他一些例子:

factorise(27, 5); ---> 25

factorise(2095, 27); ---> 1206

如您所见,返回的值包含传递给函数的因子编号的因子。但我担心的是这个表现。让它在JavaScript游戏引擎的物理中运行是否理想?最重要的是,我真的希望有一个更好的名称。

2 个答案:

答案 0 :(得分:1)

您可以提前使用因子来调整函数,并跳过与零的比较。

function factorise(factor) {
    return function (number) {
        return Math.round(number / factor) * factor;
    }
}

var factor3 = factorise(3);

console.log(factor3(10));

答案 1 :(得分:1)

可能代码不是你的瓶颈。但是这里有一个不使用浮点除法的替代方案。它在Firefox上快了10倍。

function factorise(number, factor) {
  if(factor === 0) return 0;
  var rem = number % factor;
  number -= rem;
  return 2*rem >= factor ? number+factor : number;
}
console.log(factorise(100, 3));   // 99
console.log(factorise(27, 5));    // 25
console.log(factorise(2095, 27)); // 2106

它假设数字是非负数,否则你需要一些Math.abs

考虑删除案例factor === 0,然后让它返回NaN