Como um elenco double
para decimal
qual é usado ao fazer o desenvolvimento da moeda. Para onde M
vai?
decimal dtot = (decimal)(doubleTotal);
Respostas:
Você só usa M
para um literal numérico, ao lançar é apenas:
decimal dtot = (decimal)doubleTotal;
Observe que um número de ponto flutuante não é adequado para manter um valor exato, portanto, se você primeiro somar os números e depois converter para, Decimal
poderá obter erros de arredondamento. Você pode querer converter os números em Decimal
antes de adicioná-los, ou certifique-se de que os números não são números de ponto flutuante em primeiro lugar.
Você pode converter um duplo em um decimal assim, sem precisar do M
sufixo literal:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Você deve usar o M
ao declarar um novo valor decimal literal:
decimal dec = 123.45M;
(Sem o M
, 123,45 é tratado como um duplo e não será compilado.)
use a classe de conversão padrão: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
para decimal
, dado que para um double
valor como (1000000.0 / 3.0), seria em alguns casos deseja cortar a precisão "excessiva" produzindo 333333.333333333D, mas em outros casos, seria desejável retê-la, gerando 333333.333333333313931D. Em vez de simplesmente dizer "converter em decimal", o código deve especificar como essa conversão deve ser realizada.
Convert.ToDecimal(double)
é o mesmo que (decimal)doubleTotal
, exceto se for doubleTotal
alterado para um tipo diferente, você provavelmente evitará um erro de tempo de compilação e introduzirá um erro de tempo de execução mais difícil de encontrar porque um ToDecimal diferente override pode ser chamado. O operador de elenco é muito mais explícito ...
Bem, esta é uma pergunta antiga e eu realmente usei algumas das respostas mostradas aqui. No entanto, em meu cenário específico, era possível que o double
valor para o qual eu queria converter decimal
fosse geralmente maior do que decimal.MaxValue
. Então, em vez de lidar com exceções, escrevi este método de extensão:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
A abordagem acima funciona se você não quiser se preocupar em lidar com exceções de estouro e se tal coisa acontecer, você deseja apenas manter o valor máximo possível (meu caso), mas estou ciente de que para muitos outros cenários este não seria o comportamento esperado e pode ser a manipulação de exceção será necessária.