program - Como faço para converter um decimal para um int em c#?




program in c to convert decimal to hexadecimal (8)

Como faço para converter um decimal em um int?


Arredondando um decimal para o inteiro mais próximo

decimal a ;
int b = (int)(a + 0.5m);

quando a = 49.9 , então b = 50

quando a = 49.5 , então b = 50

quando a = 49.4 , depois b = 49 etc.


Eu acho que o operador de fundição não funciona se você tiver um decimal em caixa (ou seja, um valor decimal dentro de um tipo de objeto). Convert.ToInt32 (decimal como objeto) funciona bem neste caso.

Essa situação surge ao recuperar valores IDENTITY / AUTONUMBER do banco de dados:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

Veja 4.3.2 Unboxing conversions


Um truque para arredondamento rápido é adicionar 0,5 antes de converter seu decimal em um int.

decimal d = 10.1m;
d += .5m;
int i = (int)d;

Ainda deixa i=10 , mas

decimal d = 10.5m;
d += .5m;
int i = (int)d;

Arredondaria para que i=11 .


Você não pode.

Bem, é claro que você poderia , no entanto, um int (System.Int32) não é grande o suficiente para manter todos os valores decimais possíveis.

Isso significa que se você converter um decimal maior que int.MaxValue, você irá estourar, e se o decimal for menor que int.MinValue, ele será underflow.

O que acontece quando você está sob / estouro? Uma das duas coisas. Se a sua construção estiver desmarcada (ou seja, o CLR não se importa se você fizer isso), seu aplicativo continuará após o valor acima / underflows, mas o valor no int não será o esperado. Isso pode levar a erros intermitentes e pode ser difícil de corrigir. Você terminará seu aplicativo em um estado desconhecido, o que pode resultar em seu aplicativo corrompendo os dados importantes em que está trabalhando. Não é bom.

Se a sua montagem estiver marcada (properties-> build-> advanced-> verificar o estouro / underflow aritmético ou a opção / checked do compilador), seu código lançará uma exceção quando ocorrer um under / overflow. Isto é provavelmente melhor que não; no entanto, o padrão para montagens não é verificar over / underflow.

A verdadeira questão é "o que você está tentando fazer?" Sem conhecer suas necessidades, ninguém pode dizer o que você deve fazer neste caso, além do óbvio: NÃO FAÇA ISSO.

Se você especificamente NÃO se importa, as respostas aqui são válidas. No entanto, você deve comunicar sua compreensão de que um estouro pode ocorrer e que isso não importa ao colocar seu código de conversão em um bloco não verificado .

unchecked
{
  // do your conversions that may underflow/overflow here
}

Dessa forma, as pessoas que estão atrás de você entendem que você não se importa e, se no futuro alguém alterar suas construções para / checked, seu código não será interrompido inesperadamente.

Se tudo o que você quer fazer é eliminar a parte fracionária do número, deixando a parte integral, você pode usar Math.Truncate.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));

System.Decimal implementa a interface IConvertable , que possui um membro ToInt32() .

Chamar System.Decimal.ToInt32() funciona para você?


Use Convert.ToInt32 de mscorlib como em

decimal value = 3.14m;
int n = Convert.ToInt32(value);

Veja o MSDN . Você também pode usar Decimal.ToInt32 . Mais uma vez, consulte o MSDN . Finalmente, você pode fazer um elenco direto como em

decimal value = 3.14m;
int n = (int) value;

que usa o operador de conversão explícito. Veja o MSDN .



int i = (int)d;

lhe dará o número arredondado para baixo.

Se você quiser arredondar para o número par mais próximo (ou seja,> .5 irá arredondar para cima) você pode usar

int i = (int)Math.Round(d, MidpointRounding.ToEven);

Em geral, você pode converter entre todos os tipos numéricos em C #. Se não houver informações que serão perdidas durante o elenco, você poderá fazê-lo implicitamente:

int i = 10;
decimal d = i;

embora você ainda possa fazê-lo explicitamente, se desejar:

int i = 10;
decimal d = (decimal)i;

No entanto, se você estiver perdendo informações através do elenco, deve fazê-lo explicitamente (para mostrar que está ciente de que pode estar perdendo informações):

decimal d = 10.5M;
int i = (int)d;

Aqui você está perdendo o ".5". Isso pode ser bom, mas você deve ser explícito sobre isso e fazer um elenco explícito para mostrar que você sabe que está perdendo as informações.





decimal