2009-09-16 68 views
8

Quiero un número entero para ser múltiplos de 10,100,1000 y así sucesivamente ...múltiplos de 10,100,1000, ... C#

Para por ejemplo, doble val = 35 entonces yo quiero int 40
val = 357 entonces quiero int val = 400
val = 245567 entonces quiero int val = 300000
val = 245,567.986 entonces también quiero int = 300000

¿hay algo en C# que puede ayudar en la generación de estos entero

La lógica básica que puedo pensar es: Extrac t el primer entero, sume 1 a él. Cuente el número total de dígitos y agregue ceros (totalno -1).

¿Hay alguna otra manera mejor?

Quiero asignar estos valores al eje del gráfico. Estoy intentando crear dinámicamente los valores de las etiquetas del eje en función de los puntos de datos de los gráficos.

+2

Encuentro su el segundo párrafo es excepcionalmente confuso. ¿Puedes aclarar alguno? –

+1

¿Quieres redondear? o subir al techo en el número significativo más alto (como se entiende con 245,567 => 300,000)? ¿Está bien? –

+1

"Extraiga el primer entero, agréguele 1" - ¿qué tal (digamos) 400? 4 + 1 = 5, con ceros obtienes 500. –

Respuesta

28

Esto debería hacer lo que quiera y donde x es la entrada:

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

salida:

35   40 
357   400 
245567  300000 
245567.986 300000 

si lo quieres para hacer frente a los números negativos (suponiendo que desea redondear lejos de 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); 

Lo que da:

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

demasiado lento :(-------------- –

+0

sí, eso es más elaborado. –

+1

Buena respuesta. Math gana –

0

No se puede dar una respuesta específica de c#, pero generalmente lo que está buscando es log10, como se llame en c#. Si quieres operar en número.

Si esto es acerca de la salida, se puede, de hecho, opera en la cuerda, saltar/ajustar primer número, etc.

0

Esto debe al truco:

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

Este enfoque debería funcionar para ambos positivos un valores negativos de 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); 
Cuestiones relacionadas