c# - sintaxis - significado de double en lenguaje c
¿Cómo convierto un decimal a un int en C#? (11)
Me parece que el operador de conversión no funciona si tiene un decimal en caja (es decir, un valor decimal dentro de un tipo de objeto). Convert.ToInt32 (decimal como objeto) funciona bien en este caso.
Esta situación surge cuando se recuperan valores de IDENTIDAD / AUTONUMBER de la base de datos:
SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works
int ID = (int)foo.ExecuteScalar(); // throws InvalidCastException
¿Cómo convierto un decimal a un int?
Prefiero usar Math.Round , Math.Floor , Math.Ceiling o Math.Truncate para establecer explícitamente el modo de redondeo según corresponda.
Tenga en cuenta que todos ellos también devuelven Decimal, ya que Decimal tiene un rango de valores más amplio que un Int32, por lo que aún deberá realizar el lanzamiento (y verificar si hay desbordamiento / subdesbordamiento).
checked {
int i = (int)Math.Floor(d);
}
Redondeando un decimal al entero más cercano
decimal a ;
int b = (int)(a + 0.5m);
cuando a = 49.9
, entonces b = 50
cuando a = 49.5
, entonces b = 50
cuando a = 49.4
, entonces b = 49
etc.
Un buen truco para el redondeo rápido es agregar .5 antes de convertir su decimal a un int.
decimal d = 10.1m;
d += .5m;
int i = (int)d;
Todavía deja i=10
, pero
decimal d = 10.5m;
d += .5m;
int i = (int)d;
Redondearía para que i=11
.
Usted no puede
Bueno, por supuesto que podría , sin embargo, un int (System.Int32) no es lo suficientemente grande como para contener todos los valores decimales posibles.
Eso significa que si emite un decimal que es mayor que int.MaxValue se desbordará, y si el decimal es más pequeño que int.MinValue, se desbordará.
¿Qué sucede cuando se desborda / desborda? Una de dos cosas. Si su compilación no está marcada (es decir, al CLR no le importa si lo hace), su aplicación continuará después del valor sobre / desbordamientos, pero el valor en el int no será lo que esperaba. Esto puede llevar a errores intermitentes y puede ser difícil de solucionar. Terminará su aplicación en un estado desconocido que puede hacer que su aplicación corrompa los datos importantes en los que está trabajando. No está bien.
Si se verifica su ensamblaje (propiedades-> construcción-> avanzado-> verifique el desbordamiento / subdesbordamiento aritmético o la opción / compilado del compilador), su código generará una excepción cuando ocurra un desbordamiento / desbordamiento. Esto es probablemente mejor que no; sin embargo, el valor predeterminado para los ensamblajes no es verificar el desbordamiento / desbordamiento
La verdadera pregunta es "¿qué estás tratando de hacer?" Sin conocer sus requisitos, nadie puede decirle qué debe hacer en este caso, aparte de lo obvio: NO LO HAGA.
Si específicamente NO te importa, las respuestas aquí son válidas. Sin embargo, debe comunicar que entiende que puede producirse un desbordamiento y que no importa envolviendo su código de conversión en un bloque no seleccionado
unchecked
{
// do your conversions that may underflow/overflow here
}
De esa manera, las personas que vienen detrás de usted entienden que no le importa, y si en el futuro alguien cambia / comprueba sus compilaciones, su código no se romperá inesperadamente.
Si todo lo que desea hacer es descartar la parte fraccionaria del número, dejando la parte integral, puede usar Math.Truncate.
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
System.Decimal
implementa la interfaz IConvertable
, que tiene un miembro ToInt32()
.
¿ System.Decimal.ToInt32()
a System.Decimal.ToInt32()
te funciona?
Utilice Convert.ToInt32
de mscorlib
como en
decimal value = 3.14m;
int n = Convert.ToInt32(value);
Ver MSDN . También puedes usar Decimal.ToInt32
. Una vez más, ver MSDN . Finalmente, puedes hacer un reparto directo como en
decimal value = 3.14m;
int n = (int) value;
que utiliza el operador de reparto explícito. Ver MSDN .
decimal d = 2;
int i = (int) d;
Esto debería funcionar bien.
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Aquí hay una página web de conversión de datos muy útil para los de otros. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
int i = (int)d;
le dará el número redondeado hacia abajo.
Si desea redondear al número par más cercano (es decir,> .5 se redondeará) puede usar
int i = (int)Math.Round(d, MidpointRounding.ToEven);
En general, puede convertir entre todos los tipos numéricos en C #. Si no hay información que se perderá durante el lanzamiento, puede hacerlo implícitamente:
int i = 10;
decimal d = i;
aunque todavía puedes hacerlo explícitamente si lo deseas:
int i = 10;
decimal d = (decimal)i;
Sin embargo, si va a perder información a través del reparto, debe hacerlo explícitamente (para demostrar que sabe que puede estar perdiendo información):
decimal d = 10.5M;
int i = (int)d;
Aquí estás perdiendo el ".5". Esto puede estar bien, pero debe ser explícito al respecto y hacer un reparto explícito para demostrar que sabe que puede estar perdiendo la información.