2016-12-03 18 views
1

我有這個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遊戲引擎的物理上會是理想的嗎?最重要的是,我真的想爲這個功能有一個更好的名字。

+0

爲什麼你需要檢查零並返回數值之外的東西? –

+0

除以0是不安全的,我不知道如果JavaScript有一些安全措施來防止它,但讓我們在安全的一面。但是我應該返回一個int,謝謝你的支持。 –

+1

@JohanSundman在JS中,由0歸爲的分部返回NaN,這是虛假的。 JS沒有整數,它只有64位浮點數。 – Oriol

回答

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

+0

這是一個非常好的片段!你是否在學校或其他地方瞭解到這一點? –

+1

@JohanSundman是的,可能是在學校,或者在大學。 – Oriol

1

您可以事先用該因子咖喱函數並跳過與零的比較。

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

 
var factor3 = factorise(3); 
 

 
console.log(factor3(10));

相關問題