2010-11-15 33 views
104

¿Cuál es la mejor manera de convertir un double en un int? ¿Debería usarse un yeso?convertir doble a int

+6

define "mejor". depende si quiere redondeo arriba/abajo, etc. – RPM1984

+7

@ RPM1984: Defina 'etc.' :) –

+14

@Armen - touche' :) Realmente no importa de todos modos - Skeet está aquí, nada más importa. – RPM1984

Respuesta

179

Puede usar un molde si desea el comportamiento predeterminado de truncar a cero. Alternativamente, es posible que desee utilizar Math.Ceiling, Math.Round, Math.Floor, etc., aunque aún necesitará un yeso después.

No olvide que el rango de int es mucho más pequeño que el rango de double. Una conversión de double a int no arrojará una excepción si el valor está fuera del rango de int en un contexto sin marcar, mientras que una llamada a Convert.ToInt32(double) lo hará. El resultado del lanzamiento (en un contexto no verificado) está explícitamente indefinido si el valor está fuera del rango.

+0

Me pregunto si en la máquina de 64 bits, Convert.ToInt32 ya no está bien? – user496949

+20

@user: El tamaño de un 'int' es siempre de 32 bits, independientemente de si está utilizando una máquina de 32 o 64 bits. – Joren

+2

Y los dobles pueden ser mucho más grandes que incluso un int de 64 bits. –

23

Sí, ¿por qué no?

double someDouble = 12323.2; 
int someInt = (int)someDouble; 

El uso de la clase Convert también funciona bien.

int someOtherInt = Convert.ToInt32(someDouble); 
6

Convert.ToInt32 es la mejor manera de convertir

+0

Esta es una función típicamente insegura porque acepta cualquier cosa. –

34

si utiliza fundido, es decir, (int)SomeDouble va a truncar la parte fraccionaria. Es decir, si SomeDouble fuera 4.9999, el resultado sería 4, no 5. La conversión a int no redondea el número. Si desea redondear el uso Math.Round

0

mis caminos son:

- Convert.ToInt32(double_value) 
- (int)double_value 
- Int32.Parse(double_value.ToString()); 
+8

¿No crees que la tercera forma es innecesariamente compleja y lenta? –

+6

El tercero no funcionará con dobles con partes fraccionarias. por ejemplo, 'double_value = 0.1' –

+0

Creo que puedes usar Math.Floor. – lindexi

2

creo que la mejor manera es Convert.ToInt32.

2

Aquí es un ejemplo completo

class Example 
{  
    public static void Main() 
    {  
    double x, y; 
    int i; 

    x = 10.0; 
    y = 3.0; 

    // cast double to int, fractional component lost (Line to be replaced) 
    i = (int) (x/y); 
    Console.WriteLine("Integer outcome of x/y: " + i); 
    }  
} 

Si desea redondear el número al entero más cerca de hacer lo siguiente:

i = (int) Math.Round(x/y); // Line replaced 
2

La mejor manera es simplemente usar Convert.ToInt32 . Es rápido y también se redondea correctamente.

¿Por qué hacerlo más complicado?

0
label8.Text = "" + years.ToString("00") + " years"; 

cuando se desea enviar a una etiqueta, o algo así, y no desea que cualquier componente fraccional, esta es la mejor manera

label8.Text = "" + years.ToString("00.00") + " years"; 

si desea con sólo 2, y siempre es así

0

int myInt = (int) Math.Ceiling (myDouble);