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

Use (int)value quando quiser descartar a parte fracionária. Use Convert.ToInt32(value) para arredondar ao inteiro mais próximo e um método Math quando sua regra for direcionada ou tiver uma política específica para pontos médios. O exemplo compacto a seguir compara essas opções com valores positivos.

using System;

class Program
{
    static void Main()
    {
        decimal value = 12.9m;
        Console.WriteLine("cast: " + (int)value);
        Console.WriteLine("nearest: " + Convert.ToInt32(12.5m) + ", " + Convert.ToInt32(13.5m));
        Console.WriteLine("floor: " + Math.Floor(value));
        Console.WriteLine("ceiling: " + Math.Ceiling(value));
        Console.WriteLine("away: " + Math.Round(2.5m, MidpointRounding.AwayFromZero));
    }
}
cast: 12
nearest: 12, 14
floor: 12
ceiling: 13
away: 3

A política de conversão é uma regra de negócio, não um detalhe de formatação. Se a parte fracionária continuar significativa, como em dinheiro ou medições, mantenha o valor como decimal. Qualquer conversão final para int também deve considerar valores que não cabem em Int32.

Truncar um decimal em direção a zero

Uma conversão explícita, (int)value, é a escolha mais clara para truncamento. Um literal decimal precisa do sufixo m; sem ele, um literal como 12.9 é um double. A conversão de decimal para um tipo inteiro arredonda em direção a zero: (int)12.9m é 12, enquanto (int)-12.9m é -12. Isso não é floor nem ceiling. A referência de conversões numéricas do C# documenta o comportamento em direção a zero e a falha por excesso de intervalo.

Arredondar para o inteiro mais próximo

Convert.ToInt32(decimal) arredonda para o inteiro assinado de 32 bits mais próximo em vez de truncar. Quando a parte fracionária é exatamente .5, ele usa o arredondamento de ponto médio para o par: Convert.ToInt32(12.5m) é 12, enquanto Convert.ToInt32(13.5m) é 14. Isso é útil para medições que devem chegar à unidade inteira mais próxima, mas não é a política certa quando todo ponto médio precisa se afastar de zero.

A documentação da sobrecarga decimal de Convert.ToInt32 especifica OverflowException para valores fora do intervalo de int. O método não torna seguro um decimal que exceda esse limite.

Escolher uma regra de arredondamento explícita

Aplique primeiro um método Math ao decimal e depois converta o resultado inteiro. Math.Floor move o valor em direção ao infinito negativo, então Math.Floor(-12.9m) é -13m; Math.Ceiling move o valor em direção ao infinito positivo. Portanto, ambos diferem de (int)-12.9m, que é -12.

Para arredondamento ao mais próximo com uma regra de empate deliberada, use Math.Round(value, MidpointRounding.AwayFromZero). Ele transforma 2.5m em 3m e -2.5m em -3m. O Math.Round(decimal) padrão usa o arredondamento de ponto médio para o par. Math.Truncate é outra forma legível de obter um decimal inteiro em direção a zero antes de convertê-lo para int.

Não faça o cast antes do arredondamento: (int)value já descartou a fração, portanto uma chamada posterior a Math.Round não pode restaurar a escolha pretendida. Arredonde primeiro, verifique o resultado e depois faça o cast.

Tratar valores fora do intervalo int

Um int é um inteiro assinado de 32 bits limitado por int.MinValue e int.MaxValue; Int32 é o tipo correspondente no framework. Um decimal pode representar valores além desses limites. Uma conversão de decimal para int já lança OverflowException quando o valor resultante está fora desse intervalo; ela não limita o valor a um dos extremos.

Valide o valor antes da conversão quando uma entrada fora do intervalo for possível ou capture OverflowException na fronteira da aplicação. Uma conversão checked pode tornar a intenção explícita e ajudar a testar o contrato do intervalo, mas não é o mecanismo que detecta overflow em uma conversão de decimal para int. Quando o contrato receptor permitir, mantenha decimal ou escolha um tipo inteiro mais amplo em vez de forçar silenciosamente o valor para int.

Escolher a conversão que corresponde à regra

Resultado pretendido Usar Comportamento importante
Descartar a fração (int)value Trunca em direção a zero.
int mais próximo Convert.ToInt32(value) Pontos médios são arredondados para o par.
Sempre menor ou maior Math.Floor ou Math.Ceiling, depois o cast O arredondamento direcionado difere do truncamento para valores negativos.
Comportamento personalizado para pontos médios Math.Round com MidpointRounding, depois o cast Declare explicitamente a regra para desempates.

Escolha o cast explícito para o truncamento comum. Escolha Convert.ToInt32 ou um método Math somente quando a política de arredondamento dele for a exigida pela aplicação e trate OverflowException no limite de int.