web-dev-qa-db-fra.com

Lancer une double variable en décimal

Cela semblera une question idiote à certains, mais je dois utiliser un double décimal pour l’utiliser comme monnaie. Où va le M?

decimal dtot = (decimal)(doubleTotal);
68
flo

Vous utilisez uniquement le M pour un littéral numérique, lorsque vous lancez c'est juste:

decimal dtot = (decimal)doubleTotal;

Notez qu’un nombre à virgule flottante ne convient pas pour conserver une valeur exacte. Par conséquent, si vous additionnez d’abord des nombres puis que vous convertissez en Decimal, vous risquez d’obtenir des erreurs d’arrondi. Vous voudrez peut-être convertir les nombres en Decimal avant de les additionner, ou assurez-vous que les nombres ne sont pas des nombres à virgule flottante.

60
Guffa

Vous pouvez convertir un double en décimal comme ceci, sans avoir besoin du suffixe littéral M:

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

Vous devez utiliser le M lorsque vous déclarez une nouvelle valeur décimale littérale:

decimal dec = 123.45M;

(Sans le M, 123.45 est traité comme un double et ne sera pas compilé.)

28
Chris Fulstow

utiliser la classe de conversion par défaut: Convert.ToDecimal(Double)

23
Timur Sadykov
Convert.ToDecimal(the double you are trying to convert);
14
Tom

Eh bien, cette question est ancienne et j’ai bien utilisé certaines des réponses présentées ici. Néanmoins, dans mon scénario particulier, il était possible que la valeur double que je voulais convertir en decimal soit souvent supérieure à decimal.MaxValue. Ainsi, au lieu de gérer les exceptions, j’ai écrit cette méthode d’extension:

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

L'approche ci-dessus fonctionne si vous ne voulez pas vous soucier de la gestion des exceptions de dépassement et si cela se produit, vous voulez simplement conserver la valeur maximale possible (mon cas), mais je suis conscient que pour de nombreux autres scénarios, ce ne serait pas le comportement attendu et peut être la gestion des exceptions sera nécessaire.

1
taquion