2016-05-12 14 views
2

Ich möchte die nächste x-Zehner-Platz Nummer in der Lage sein zu bekommen über und unter einer beliebigen Anzahl mit C#erhalten nächsten Zehnstellige Zahl oberhalb und unterhalb einer beliebigen Anzahl

Zum Beispiel, wenn ich eine 4-stellige haben Zahl und ich möchte die ganze schließt Nummer oben und unten endet und eine Reihe von 2-stelligen Zahl wie 30, 50, 80 oder 00 dann

2126 => 2100 and 2130 
2146 => 2130 and 2150 
2183 => 2180 and 2200 

ich möchte in der Lage sein, dies zu unter 1 zu tun, wie wenn Mein Satz von Leveln ist 0.0030, 0.0050, 0.0080 und 0.0000 dann wenn ich die folgenden Nummern hätte

1.0026 => 1.0000 and 1.0030 
1.0046 => 1.0030 and 1.0050 
1.0083 => 1.0080 and 1.0100 

Der Zweck ist die Berechnung von Hi/Lo-Bereichen um einen bestimmten Asset-Preis und eine Reihe von Range-Werten.

+0

hatten Sie versucht, Math.Round? –

+0

ja ich habe, und Math.Ceiling(), ist der Trick, es auf eine Weise zu tun, die auf die Anzahl der Dezimalstellen in den Bereichsnummern generisch ist und auf/abrunden auf die richtige Zehnerstelle. – shodson

+0

dann müssen Sie Ihre eigene Logik dafür erstellen. –

Antwort

1

Da dies nicht wirklich etwas mit Rundungen von 10 zu tun hat, müssen Sie die Anzahl der Ziffern angeben, die Sie abschneiden möchten, und dann über die "set point" -Werte iterieren, um die beiden nächsten Punkte zu finden .

Das ist, was ich kam mit:

Func<double, double[], int, double> lower = (x, sps, d) => 
    sps 
     .Select(sp => sp + Math.Truncate(Math.Pow(10.0, d) * x)/Math.Pow(10.0, d)) 
     .Where(v => v <= x) 
     .Last(); 

Func<double, double[], int, double> upper = (x, sps, d) => 
    sps 
     .Select(sp => sp + Math.Truncate(Math.Pow(10.0, d) * x)/Math.Pow(10.0, d)) 
     .Where(v => v >= x) 
     .First(); 

Mein Eingang data ist:

var data = new [] 
{ 
    new 
    { 
     setpoints = new double[] { 0, 30, 50, 80, 100 }, 
     digits = -2, 
     values = new double[] { 2126, 2146, 2183 }, 
    }, 
    new 
    { 
     setpoints = new [] { 0.0, 0.003, 0.005, 0.008, 0.01 }, 
     digits = 2, 
     values = new [] { 1.0026, 1.0046, 1.0083 }, 
    }, 
}; 

Die Ergebnisse wurden wie folgt berechnet:

var results = 
    data 
     .SelectMany(
      x => x.values, 
      (x, v) => new 
      { 
       value = v, 
       lower = lower(v, x.setpoints, x.digits), 
       upper = upper(v, x.setpoints, x.digits) 
      }); 

Die Ergebnisse habe ich waren als erwartet:

results

+0

Wow danke! Verblüfft... – shodson