2016-12-03 3 views
1

私はこのJavaScript関数を使用していますが、同じ結果を得るためのよりよい方法があるかどうかは疑問です。私は100であることが起こっ私のランダムに生成された数が3でdivideableになりたい場合は数値を別の数値のファクタにする(パフォーマンス上の問題)

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

は今、私はこの機能を使用することができます。ここで

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

いくつかの他の例である:あなたが返された値が関数に渡された要素数の要因が含まれて見ることができるように

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

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

。しかし、私の懸念はこれのパフォーマンスです。 JavaScriptのゲームエンジンの物理学で動作させるのが理想的でしょうか?その上に私は本当に関数のより良い名前を持ってほしいと思っています。

+0

なぜゼロのチェックが必要なのですか?数値以外の何かを返しますか? –

+0

0で割ることは安全ではありません、私はJavaScriptがそれを防ぐための安全対策を持っているかどうかわかりませんが、安全な側にさせてください。私はintを返すべきです、それを賞賛してくれてありがとう。 –

+1

@JohanSundman JSでは、0で区切るとNaNが返されますが、これは偽です。 JSはintを持たず、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));

関連する問題