2016-06-30 8 views
-3

Wie kann ich mit einer Nummer die nächsten zwei Zahlen finden, die mit 1, 2.5 oder 5 beginnen? (10, 25, 50, 100, 250, 500, 1000 ... endlos)Wie finde ich die nächsten zwei Nummern einer benutzerdefinierten Funktion?

Das Ergebnis sollte die nächstgelegene nächsthöhere und eine darunter liegende Nummer sein.

Zum Beispiel: die Zahl 420 250 und 500. Zum Beispiel zurückgeben sollte: Die Zahl 10 sollte zurückkehren 10 und 25

Können Lodash verwenden, wenn es nützlich ist.

Danke.

+2

Zuerst Arrays kann nicht endlos sein, weil sie im Speicher gehalten werden, die ist offensichtlich endlich. Sprechen Sie über einen unendlichen [Iterator] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators)? Und zweitens, sind die Zahlen in einer bestimmten Reihenfolge? – McMath

+0

Es ist kein Array, ich bin nur auf der Suche nach den beiden nächsten Zahlen, die auf 1, 2,5 und 5 gerundet sind. Ich habe nur eine Nummer, ein anderes Beispiel: für die Zahl 1.200.000 würde ich gerne 1.000.000 und 2.500.000. –

+0

@RonenTeva Wenn es kein Array ist, wo möchten Sie diese Nummern finden? und was ist, wenn die angegebene Zahl 10 für diese Liste ist. Was sollte die Antwort sein? –

Antwort

2

OK, ich denke, ich verstehe, basierend auf Ihren Kommentaren.

// Finds the two numbers on each side for any number. 
function nearest(n) { 
    let m = multiplier(n); 
    return nearest10(n/m).map(n => n * m); 
} 

// Finds the two numbers on each side for numbers between 1 and 10. 
function nearest10(n) { 
    return n < 2.5 ? [1, 2.5] : n < 5 ? [2.5, 5] : [5, 10]; 
} 

// Returns the neareast power of 10 less than or equal to n. 
function multiplier(n) { 
    return Math.pow(10, Math.floor(Math.log10(n))); 
} 

Und hier ist eine Probe der Ergebnisse:

console.log(nearest(2));  // [1, 2.5] 
console.log(nearest(420)); // [250, 500] 
console.log(nearest(79310)); // [50000, 100000] 
0
function findPrevAndNext(x){ 
    // returns the next highest value and previous 
    // lower value in the infinite series 
    // [1, 2.5, 5, 10, 25, 50, 100, ...] 

    var top = 5; 

    while(top < x){ 
    top = top * 10; 
    } 

    var mid = top/2; // ex: 5/2 = 2.5 
    var bot = top/5; // ex: 5/5 = 1 

    var prev, next = 0; 

    if(x >= mid){ 
    prev = mid; 
    next = top; 
    } 
    else if(x >= bot){ 
    prev = bot; 
    next = mid; 
    } 
    else{ 
    prev = bot/2; 
    next = bot 
    } 

    return Array(prev,next); 
} 

https://jsfiddle.net/o44t0t65/1/

1

Zunächst wird die Zahl in wissenschaftlicher Notation schreibt die Skala loszuwerden.

420 = 4.2x10^2 

suchen Sie dann die Mantisse unter [1, 2.5), [2.5, 5), [5, 10).

4.2 in [2.5, 5) 

Und die Exponenten übertragen,

2.5x10^2 = 250, 5x10^2 = 500 

Dies besser erfolgte Basis unter Verwendung von 10 Logarithmen,

L= log(X)/log(10) 
E= floor(L) 
L= L - E 
if  L < log(2.5), LB=  pow(10, N), UB= 2.5 * pow(10,N) 
else if L < log(5) , LB= 2.5 * pow(10, N), UB= 5 * pow(10,N) 
else     LB= 5 * pow(10, N), UB= 10 * pow(10,N) 
Verwandte Themen