HOWTO · Csharp
Converter decimal em int em C#
Converta decimal em int em C# escolhendo a regra de arredondamento adequada e tratando valores fora de Int32.
Nesta página
Para converter um decimal de C# em int, use uma conversão explícita para descartar a fração e Convert.ToInt32 para arredondar ao inteiro mais próximo. Para regras sempre para baixo, para cima ou de ponto médio, arredonde antes de converter. Todas podem lançar OverflowException se o valor não couber em Int32.
A escolha é uma regra de negócio: -12.9m torna-se -12 ao truncar, mas -13 com Math.Floor. Mantenha decimal para dinheiro ou medições quando a fração importa.
Truncar um decimal em direção a zero
(int)value é claro quando a intenção é truncar. Um literal decimal requer m; sem ele, 12.9 é double. A conversão integral vai para zero, não usa floor nem ceiling. C# numeric conversions.
using System;
decimal positive = 12.9m;
decimal negative = -12.9m;
Console.WriteLine($"cast: {(int)positive}, {(int)negative}");
Console.WriteLine($"round: {Convert.ToInt32(12.5m)}, {Convert.ToInt32(13.5m)}");
try
{
decimal tooLarge = decimal.MaxValue;
Console.WriteLine(checked((int)tooLarge));
}
catch (OverflowException)
{
Console.WriteLine("overflow");
}
cast: 12, -12
round: 12, 14
overflow
A primeira linha descarta as frações e move o negativo para zero; a última é o limite. checked torna o overflow explícito e o catch permite relatá-lo.
Arredondar para o inteiro mais próximo
Convert.ToInt32(decimal) não trunca: arredonda ao int assinado de 32 bits mais próximo e, em .5, para o par. O teste dá 12 para 12.5m e 14 para 13.5m.
Escolha Convert.ToInt32 somente se arredondar para par for a política. A sua decimal overload.
Escolher uma regra de arredondamento explícita
Para arredondamento dirigido, aplique Math ao decimal antes do cast. Math.Floor vai ao menos infinito e Math.Ceiling ao mais infinito; Math.Floor(-12.9m) é -13m, enquanto (int)-12.9m é -12.
Para outra regra de empate, declare-a: Math.Round(value, MidpointRounding.AwayFromZero) torna 2.5m em 3m e -2.5m em -3m; Math.Round(decimal) usa par. Math.Truncate.
Não faça cast antes de arredondar: (int)value já perdeu a fração. Arredonde, valide o intervalo e depois converta.
Tratar valores fora do intervalo int
int vai de int.MinValue a int.MaxValue; decimal representa valores muito além. Conversão fora do intervalo lança OverflowException, não limita o valor.
Valide entradas ou capture OverflowException na fronteira da aplicação. Não converta dinheiro silenciosamente para caber numa API: use um inteiro maior ou mantenha decimal se o contrato permitir.
Escolher a conversão que corresponde à regra
| Resultado | Usar | Comportamento |
|---|---|---|
| Descartar fração | (int)value |
Em direção a zero. |
int mais próximo |
Convert.ToInt32(value) |
Pontos médios para par. |
| Sempre menor ou maior | Math.Floor ou Math.Ceiling, depois cast |
Difere para negativos. |
| Regra própria de ponto médio | Math.Round com MidpointRounding, depois cast |
Declare a regra. |
Para truncamento normal, o cast explícito é a resposta curta. Use Convert.ToInt32 ou Math apenas para a política desejada e trate OverflowException no limite de int.