Come si fa a lanciare un double
a decimal
che viene utilizzato quando si fa sviluppo valutario. Dove M
va?
decimal dtot = (decimal)(doubleTotal);
Risposte:
Usi solo il M
per 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 Decimal
potresti ottenere errori di arrotondamento. Potresti voler convertire i numeri in Decimal
prima 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 M
suffisso letterale:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
È necessario utilizzare M
quando 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);
double
a decimal
, dato che per un double
valore 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 doubleTotal
cambiato 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 double
valore a cui volevo convertirmi decimal
fosse 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.