2009-03-11 11 views

Respuesta

68

Uso Math.round(), posiblemente en conjunción con MidpointRounding.AwayFromZero

por ejemplo:

Math.Round(1.2) ==> 1 
Math.Round(1.5) ==> 2 
Math.Round(2.5) ==> 2 
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3 
+5

¿No hará 'Convert.ToInt32()' hacer lo mismo, o simplemente tira todo después del decimal? –

+144

No produce un número entero, sino un doble. – gatopeich

+0

Creo que hay una contradicción (es decir, error) entre las líneas 2 y 3 anteriores, ¿no? – Ronnie

188
double d = 1.234; 
int i = Convert.ToInt32(d); 

Reference

manejadores de redondeado de este modo:

redondeado al entero con signo de 32 bits más cercano. Si el valor está a mitad de camino entre entre dos números enteros, se devuelve el número par; es decir, 4,5 se convierte en 4, y 5.5 se convierte a 6.

+5

Mucho mejor que 'Math.Round' ya que devuelve un int según sea necesario. – Keith

+5

@Keith: pero redondea de forma no válida ** incluso.5 ** a * incluso * en lugar de * incluso + 1 * ... –

+7

@ robert-koritnik. No estoy seguro de por qué eso es "inválido". OP no especificó una regla de redondeo preferida, y "redondear .5 a la par más cercana" es la regla estándar de hace mucho tiempo. Siempre redondeando tiene efectos estadísticos no deseados. – Keith

8
double d; 
int rounded = (int)Math.Round(d); 
0

Estoy desarrollando una calculadora científica de que el deporte un botón Int. He encontrado la siguiente es una solución simple, fiable:

double dblInteger; 
if(dblNumber < 0) 
    dblInteger = Math.Ceiling(dblNumber); 
else 
    dblInteger = Math.Floor(dblNumber); 

Math.Round veces produce resultados inesperados o indeseables, y la conversión explícita a entero (a través de yeso o Convert.ToInt ...) a menudo produce valores erróneos para números de mayor precisión. El método anterior parece funcionar siempre.

+1

¿no redondea todos los números negativos y redondea todos los números positivos? Ese no es necesariamente el entero "más cercano". –

+0

este no es el número más cercano. –

+0

Dado 1.99, esto devuelve 1.0. –

31

También puede utilizar la función:

//Works with negative numbers now 
static int MyRound(double d) { 
    if (d < 0) { 
    return (int)(d - 0.5); 
    } 
    return (int)(d + 0.5); 
} 

Dependiendo de la arquitectura es varias veces más rápido.

+0

Esto fue perfecto para mí ya que Math.Round no funcionaba como yo quería. – Johannes

+0

@cullub sí lo hace. Convierte el doble d que tenía 0.5 anexado a él, a un número entero. – Darrell

+0

Este es mi método preferido: funciona de una manera muy simple. Mucho más corto y más fácil de leer que Math.Round (d, MidpointRounding.AwayFromZero) y más conciso que usar una instrucción if para elegir redondear o redondear. Y, de hecho, devuelve un número entero al final, no un doble – binderbound

4

Sé que esta pregunta es antigua, pero la encontré en mi búsqueda por la respuesta a una pregunta similar. Pensé que compartiría el consejo muy útil que me han dado.

Al convertir a int, simplemente agregue .5 a su valor antes de la bajada. Como downcasting to int siempre cae al número más bajo (ej. (Int) 1.7 = 1), si tu número es .5 o superior, al agregar .5 lo traerá al siguiente número y tu downcast a int debería devolver el valor correcto . (Por ejemplo, (int) (1.8 + .5) = 2)

Espero que esta respuesta sea útil para cualquier persona.

+12

El problema es si intenta convertir valores negativos de esa manera. Por ejemplo -1.25 terminará igual a 0. (-1.25 + 0.5 = 0.75, y una vez arrojado a int es 0). Entonces necesitas restar 0.5 de los valores negativos. – Eternal21

Cuestiones relacionadas