2009-09-16 13 views
8

Voglio un numero intero di essere multipli di 10,100,1000 e così via ...Multipli di 10,100,1000, ... C#

Per esempio double val = 35 allora voglio int 40
val = 357 poi voglio int val = 400
val = 245.567 allora voglio int val = 300.000
val = 245,567.986 poi anche io voglio int = 300.000

c'è qualcosa in C# che può aiutare a generare questi numeri interi

Logica di base che posso pensare: Extrac t il primo numero intero, aggiungi 1 ad esso. Contare il numero totale di cifre e aggiungere zeri (totale -1).

C'è un modo migliore?

Desidero assegnare questi valori all'asse del grafico. Sto cercando di creare dinamicamente i valori dell'etichetta dell'asse in base ai punti dati dei grafici.

+2

trovo la tua secondo paragrafo per essere eccezionalmente confuso. Puoi chiarire qualsiasi? –

+1

Vuoi arrotondare? o aumentare al massimo il numero più significativo (come inteso con 245.567 => 300.000)? È giusto? –

+1

"Estrai il primo numero intero, aggiungi 1 ad esso" - per quanto riguarda (dire) 400? 4 + 1 = 5, con zero ottieni 500. –

risposta

28

Questo dovrebbe fare quello che vuoi, dove x è l'ingresso:

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

uscita:

35   40 
357   400 
245567  300000 
245567.986 300000 

se lo vuoi far fronte con i numeri negativi (supponendo che si desidera arrotondare lontano da 0):

 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); 

Che dà:

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

troppo lento :(-------------- –

+0

sì, è più elaborato –

+1

Bella risposta. La matematica vince. –

0

Impossibile darti una risposta specifica c#, ma in genere quello che stai cercando è log10, come si chiama in c#. Se vuoi operare sul numero.

Se si tratta di uscita, è possibile, infatti, operare su stringa, saltando/regolazione primo numero, ecc

0

Questo dovrebbe per il trucco:

// 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

Questo approccio dovrebbe funzionare sia per un valori negativi positivi di x:

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);