¿Cómo convierto un decimal a int?
¿Cómo convierto un decimal a int?
Respuestas:
Usar Convert.ToInt32
desde mscorlib
como en
decimal value = 3.14m;
int n = Convert.ToInt32(value);
Ver MSDN . También puedes usar Decimal.ToInt32
. Nuevamente, vea MSDN . Finalmente, puedes hacer un elenco directo como en
decimal value = 3.14m;
int n = (int) value;
que usa el operador de conversión explícito. Ver MSDN .
null
vs. 0
vs. ""
). Recomiendo nunca usar Convertir a menos que necesite absolutamente su flexibilidad (es decir, en escenarios de tipo dinámico)
OverflowException
. Creo que @Will proporciona una mejor respuesta aquí stackoverflow.com/a/501165/39532
Convert.ToInt32
y Decimal.ToInt32
compórtese de manera diferente. Desde MSDN: Decimal.ToInt32
- El valor de retorno es la parte integral del valor decimal; los dígitos fraccionarios se truncan . Convert.ToInt32
- Valor de retorno redondeado al entero con signo de 32 bits más cercano. Si el valor está a medio camino entre dos números enteros, se devuelve el número par; es decir, 4.5 se convierte en 4 y 5.5 se convierte en 6.
No puedes
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 lanza 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 estás bajo / desbordado? 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 de que el valor exceda / disminuya, pero el valor en el int no será lo que esperaba. Esto puede provocar errores intermitentes y puede ser difícil de solucionar. Terminará su aplicación en un estado desconocido que puede provocar que su aplicación corrompa los datos importantes en los que está trabajando. No está bien.
Si su ensamblaje está marcado (propiedades-> compilación-> avanzado-> verifique el desbordamiento / desbordamiento aritmético o la opción / compilador comprobado), su código arrojará 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 exceso / 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 su comprensión de que puede ocurrir un desbordamiento y que no importa envolviendo su código de transmisión en un bloque no verificado
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 sus compilaciones a / verificado, su código no se romperá inesperadamente.
Si todo lo que quiere hacer es soltar 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));
int i = (int)d;
le dará el número redondeado hacia abajo.
Si desea redondear al número par más cercano (es decir, se redondeará> .5) puede usar
int i = (int)Math.Round(d, MidpointRounding.ToEven);
En general, puede emitir entre todos los tipos numéricos en C #. Si no hay información que se perderá durante el reparto, puede hacerlo implícitamente:
int i = 10;
decimal d = i;
aunque aún puede hacerlo explícitamente si lo desea:
int i = 10;
decimal d = (decimal)i;
Sin embargo, si va a perder información a través del elenco, 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.
ToEven
debes evitar la deriva estadística. Sin embargo, si opera con artículos o dinero con cargo, AwayFromZero
parece ser la opción correcta.
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Aquí hay una página web de conversión de datos muy útil para aquellos de otros. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
implementa la IConvertable
interfaz, que tiene un ToInt32()
miembro.
¿Las llamadas System.Decimal.ToInt32()
funcionan para ti?
Un buen truco para el redondeo rápido es agregar .5 antes de convertir su decimal a int.
decimal d = 10.1m;
d += .5m;
int i = (int)d;
Todavía se va i=10
, pero
decimal d = 10.5m;
d += .5m;
int i = (int)d;
Redondearía para que i=11
.
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 mayor que un Int32, por lo que aún tendrá que emitir (y verificar si hay desbordamiento / desbordamiento).
checked {
int i = (int)Math.Floor(d);
}
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 los valores IDENTITY / 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
SELECT SCOPE_IDENTITY()
vuelve lo numeric(38, 0)
que se traduce en decimal
.NET. foo.ExecuteScalar()
devuelve un decimal
cuadro en el object
que no se puede lanzar directamente a un int
. (int)(decimal)foo.ExecuteScalar()
o Convert.ToInt32(foo.ExecuteScalar())
funcionaría
Ninguna respuesta parece tratar con la excepción OverflowException / UnderflowException que proviene de intentar convertir un decimal que está fuera del rango de int.
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
Esta solución devolverá el valor int máximo o mínimo posible si el valor decimal está fuera del rango int. Es posible que desee agregar algunos redondeos con Math.Round, Math.Ceiling o Math.Floor para cuando el valor esté dentro del rango int.