Como um elenco doublepara decimalqual é usado ao fazer o desenvolvimento da moeda. Para onde Mvai?
decimal dtot = (decimal)(doubleTotal);
Respostas:
Você só usa Mpara 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, Decimalpoderá obter erros de arredondamento. Você pode querer converter os números em Decimalantes 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 Msufixo literal:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Você deve usar o Mao 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);
doublepara decimal, dado que para um doublevalor 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 doubleTotalalterado 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 doublevalor para o qual eu queria converter decimalfosse 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.