convertir doble a int


156

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


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.


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


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);

7

Convert.ToInt32 es la mejor forma de convertir


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?


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



0

Mis caminos son:

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

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í

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.