Domanda
Voglio che un numero intero sia multiplo di 10.100.1000 e così via ...
Ad esempio double val = 35 quindi voglio int 40
val = 357 quindi voglio int val = 400
val = 245.567 quindi voglio int val = 300.000
val = 245.567.986 quindi voglio anche int = 300.000
C'è qualcosa in C # che può aiutare a generare questi numeri interi
La logica di base che posso pensare è: Estrai il primo intero, aggiungi 1 ad esso. Contare il numero totale di cifre e aggiungere zeri (totalno -1).
C'è un modo migliore?
Voglio 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.
Soluzione
Questo dovrebbe fare quello che vuoi dove x è l'input:
double scale = Math.Pow(10, (int)Math.Log10(x));
int val = (int)(Math.Ceiling(x / scale) * scale);
Output:
35 40
357 400
245567 300000
245567.986 300000
Se vuoi far fronte a numeri negativi (supponendo che tu voglia arrotondare 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
Altri suggerimenti
Questo approccio funzionerebbe con valori positivi e negativi 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);
Non posso darti una risposta specifica per c #
, ma generalmente quello che stai cercando è log10
, qualunque cosa venga chiamata in c #
. Se si desidera operare sul numero.
Se si tratta dell'output, puoi effettivamente operare su stringa, saltare / regolare il primo numero, ecc.
Questo dovrebbe essere 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;