2009-09-16 7 views
8

Ich möchte eine ganzzahlige Vielfache von 10,100,1000 zu sein, und so weiter ...Multiples von 10,100,1000, ... C#

Für zB Doppel val = 35 dann will ich int 40
val = 357 dann will ich val = 400
val int = 245.567 dann will ich int val = 300000
val = 245,567.986 dann auch ich will int = 300000

gibt es etwas in C#, die bei der Erzeugung dieser ganzen Zahl

helfen

Grundlegende Logik, die ich denken kann, ist: Extrac t die erste ganze Zahl, addiere 1 dazu. Zählen Sie die Gesamtzahl der Ziffern und fügen Sie Nullen hinzu (Gesamtanzahl -1).

Gibt es einen besseren Weg?

Ich möchte diese Werte der Diagrammachse zuweisen. Ich versuche, die Achsenbeschriftungswerte basierend auf Datenpunkten der Diagramme dynamisch zu erstellen.

+2

Ich finde Ihre Der zweite Absatz ist außergewöhnlich verwirrend. Kannst du irgendwas klären? –

+1

Sie möchten runden? oder auf die höchste signifikante Zahl anheben (im Sinne von 245.567 => 300.000)? Ist das richtig? –

+1

"Extrahiere die erste Ganzzahl, füge 1 hinzu" - was ist mit (sagen wir) 400? 4 + 1 = 5, mit Nullen erhalten Sie 500. –

Antwort

28

Dies sollte das tun, was Sie wollen, wo x die Eingabe:

 double scale = Math.Pow(10, (int)Math.Log10(x)); 
     int val = (int)(Math.Ceiling(x/scale) * scale); 

Ausgang:

35   40 
357   400 
245567  300000 
245567.986 300000 

Wenn Sie es mit negativen Zahlen zu bewältigen (vorausgesetzt, Sie wollen von 0 abzurunden entfernt):

 double scale = (x == 0 ? 1.0 : Math.Pow(10, (int)Math.Log10(Math.Abs(x)))); 
     int val = (int)(Math.Ceiling(Math.Abs(x)/scale) * scale)* Math.Sign(x); 

Welche gibt:

-35   -40 
0   0 
35   40 
357   400 
245567  300000 
245567.986 300000 
+0

zu langsam :(-------------- –

+0

yup, das ist aufwendiger. –

+1

Schöne Antwort. Mathematik gewinnt. –

0

Kann nicht geben Sie eine c#-spezifische Antwort, aber in der Regel, was Sie suchen, ist log10, wie auch immer es in c# genannt wird. Wenn Sie auf Nummer operieren möchten.

Wenn diese über Ausgabe, können Sie tatsächlich arbeiten auf Zeichenfolge, das Überspringen/Einstellen erste Zahl usw.

0

Diese auf den Trick sollen:

// val is the value 
var log = Math.Floor(Math.Log10(val)); 
var multiplier = Math.Pow(10, log); 

var result = Math.Ceiling(val/multiplier)*multiplier; 
2

Dieser Ansatz sollte sowohl positive als ein negativen Werte von x arbeiten:

int log = (x == 0) ? 1 : (int)(Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(x))))); 
int result = (int)(((x < 0) ? Math.Floor(x/log) : Math.Ceiling(x/log)) * log); 
Verwandte Themen