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.