Come si fa a lanciare un doublea decimalche viene utilizzato quando si fa sviluppo valutario. Dove Mva?
decimal dtot = (decimal)(doubleTotal);
Risposte:
Usi solo il Mper un letterale numerico, quando lanci è solo:
decimal dtot = (decimal)doubleTotal;
Nota che un numero in virgola mobile non è adatto per mantenere un valore esatto, quindi se aggiungi prima i numeri e poi li converti Decimalpotresti ottenere errori di arrotondamento. Potresti voler convertire i numeri in Decimalprima di sommarli o assicurarti che i numeri non siano numeri in virgola mobile in primo luogo.
Puoi lanciare un doppio in un decimale come questo, senza bisogno del Msuffisso letterale:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
È necessario utilizzare Mquando si dichiara un nuovo valore decimale letterale:
decimal dec = 123.45M;
(Senza il M, 123.45 viene considerato come un doppio e non verrà compilato.)
usa la classe di conversione predefinita: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
doublea decimal, dato che per un doublevalore come (1000000.0 / 3.0) si sarebbe in alcuni casi si desidera ritagliare la precisione "in eccesso" ottenendo 333333.333333333D, ma in altri casi si vorrebbe mantenerla, ottenendo 333333.333333333313931D. Invece di dire semplicemente "converti in decimale", il codice dovrebbe specificare come deve essere eseguita la conversione.
Convert.ToDecimal(double)è lo stesso di (decimal)doubleTotal, tranne se doubleTotalcambiato in un tipo diverso probabilmente eviterai un errore in fase di compilazione e introdurrai un errore di runtime più difficile da trovare perché un ToDecimal diverso override potrebbe essere chiamato. L'operatore del cast è molto più esplicito ...
Bene, questa è una vecchia domanda e ho effettivamente utilizzato alcune delle risposte mostrate qui. Tuttavia, nel mio particolare scenario era possibile che il doublevalore a cui volevo convertirmi decimalfosse spesso maggiore di decimal.MaxValue. Quindi, invece di gestire le eccezioni, ho scritto questo metodo di estensione:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
L'approccio di cui sopra funziona se non vuoi preoccuparti di gestire le eccezioni di overflow e se accade una cosa del genere vuoi solo mantenere il valore massimo possibile (il mio caso), ma sono consapevole che per molti altri scenari questo non sarebbe il comportamento previsto e potrebbe essere necessaria la gestione delle eccezioni.