2016-12-03 3 views
1

Ich habe diese funktionierende JavaScript-Funktion und ich frage mich, ob es eine bessere Möglichkeit geben könnte, das gleiche Ergebnis zu erzielen.Machen Sie Nummer einen Faktor einer anderen Zahl (Leistungsbedenken)

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

Jetzt Wenn ich meine zufällig generierte Zahl wollen würde, die 100 passiert sein divideable um 3 zu sein, ich könnte diese Funktion verwenden.

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

Hier sind einige weitere Beispiele:

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

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

Wie Sie die zurückgegebenen Werte enthalten, um die Funktion übergeben den Faktor der Faktor Nummer sehen können. Aber meine Sorge ist die Leistung davon. Wäre es ideal, wenn es in der Physik einer JavaScript Game Engine läuft? Außerdem möchte ich einen besseren Namen für die Funktion haben.

+0

Warum brauchen Sie die Überprüfung auf Null und geben Sie etwas außerhalb eines numerischen Werts zurück? –

+0

dividieren durch 0 ist nicht sicher, ich weiß nicht, ob Javascript eine Sicherheitsmaßnahme hat, um es zu verhindern, aber lassen Sie uns auf der sicheren Seite sein. Ich sollte jedoch ein int zurückgeben, danke, dass ich es ausgespielt habe. –

+1

@JohanSundman In JS geben Divisionen mit 0 NaN zurück, was falsch ist. JS hat keine Ints, es hat nur 64-Bit-Floats. – Oriol

Antwort

1

Wahrscheinlich ist, dass Code Ihr Engpass nicht. Aber hier ist eine Alternative, die keine Gleitkommadivision verwendet. Es ist 10 mal schneller bei Firefox.

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

Es setzt voraus, die Zahlen nicht-negativ sind, sonst würden Sie einige Math.abs benötigen.

Betrachten wir den Fall factor === 0 zu entfernen und nur NaN zurückkehren lassen.

+0

Das ist ein wirklich nettes Stück! Hast du das in der Schule oder anderswo gelernt? –

+1

@JohanSundman Ja, wahrscheinlich in der Schule oder sonst in der Universität. – Oriol

1

Sie könnten die Funktion mit dem Faktor im Voraus Curry und den Vergleich mit Null überspringen.

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

 
var factor3 = factorise(3); 
 

 
console.log(factor3(10));

Verwandte Themen