convertir doble a int

156

¿Cuál es la mejor manera de convertir un doublea int? ¿Se debe usar un yeso?

user496949
fuente
77
definir "mejor". depende si desea redondeo hacia arriba / abajo, etc.
RPM1984
8
@ RPM1984: Define etc.:)
Armen Tsirunyan
18
@Armen - touche` :) Realmente no importa de todos modos: Skeet está aquí, nada más importa.
RPM1984

Respuestas:

237

Puede usar una conversión si desea el comportamiento predeterminado de truncar hacia cero. Alternativamente, es posible que desee utilizar Math.Ceiling, Math.Round, Math.Flooretc - a pesar de que todavía se necesita un molde después.

No olvide que el rango de intes mucho menor que el rango de double. Un lanzamiento desde doublehasta intno arrojará una excepción si el valor está fuera del rango de inten un contexto no verificado, mientras que una llamada a Convert.ToInt32(double)voluntad. El resultado de la conversión (en un contexto no verificado) está explícitamente indefinido si el valor está fuera del rango.

Jon Skeet
fuente
24
@usuario: el tamaño de un intsiempre es de 32 bits, independientemente de si está utilizando una máquina de 32 o 64 bits.
Joren
3
Y los dobles pueden ser mucho más grandes que incluso un int de 64 bits.
Adrian Ratnapala
77
Para noobs de C # como yo: tanto Math como Convert son parte del sistema. Entonces la respuesta completa se ve así:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris
9
@ user1290746: Eso funcionaría, pero por lo general solo estaría using System;en la parte superior del archivo, momento en el que podría serintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet,
3
@ user1290746: Pero en ese caso, no creo que la solución correcta sea aconsejar a las personas que usen nombres completamente calificados; la mejor solución es aprender sobre las usingdirectivas.
Jon Skeet
39

si usa cast, es decir, (int)SomeDoubletruncará la parte fraccional. Es decir, si SomeDoublefuera 4.9999, el resultado sería 4, no 5. La conversión a int no redondea el número. Si quieres usar redondeoMath.Round

Armen Tsirunyan
fuente
34

¿Si, Por qué no?

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

Usar la Convertclase también funciona bien.

int someOtherInt = Convert.ToInt32(someDouble);
Jeff Mercado
fuente
7

Convert.ToInt32 es la mejor forma de convertir

anishMarokey
fuente
Esta es una función típicamente insegura porque acepta cualquier cosa.
Ant_222
4

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

¿Por qué hacerlo más complicado?

majed
fuente
2

Aquí hay 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 cercano, haga lo siguiente:

i = (int) Math.Round(x / y); // Line replaced
mariana más suave
fuente
1

Creo que la mejor manera es Convert.ToInt32.

único
fuente
1

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

mathewsun
fuente
0

Mis caminos son:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
kst
fuente
11
¿No crees que la tercera vía es innecesariamente compleja y lenta?
Armen Tsirunyan el
66
El tercero no funcionará con dobles con partes fraccionarias. por ejemplo,double_value = 0.1
Jeff Mercado
Creo que puedes usar Math.Floor.
lindexi
0
label8.Text = "" + years.ToString("00") + " years";

cuando desea enviarlo a una etiqueta, o algo así, y no desea ningún componente fraccional, esta es la mejor manera

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

si quieres con solo 2, y siempre es así

Piedad
fuente