Comment jette-t-on un double
à decimal
qui est utilisé lors du développement de devises. Où M
va-t-il?
decimal dtot = (decimal)(doubleTotal);
Réponses:
Vous n'utilisez le que M
pour un littéral numérique, lorsque vous castez simplement:
decimal dtot = (decimal)doubleTotal;
Notez qu'un nombre à virgule flottante n'est pas adapté pour conserver une valeur exacte, donc si vous ajoutez d'abord des nombres ensemble, puis convertissez en, Decimal
vous pouvez obtenir des erreurs d'arrondi. Vous souhaiterez peut-être convertir les nombres en Decimal
avant de les additionner, ou vous assurer que les nombres ne sont pas des nombres à virgule flottante en premier lieu.
Vous pouvez convertir un double en décimal comme ceci, sans avoir besoin du M
suffixe littéral:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Vous devez utiliser le M
lors de la déclaration d'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é.)
utiliser la classe de conversion par défaut: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
vers decimal
, étant donné que pour une double
valeur comme (1000000.0 / 3.0) on le ferait dans certains cas veulent couper une précision "excessive" donnant 333333,333333333D, mais dans d'autres cas, on voudrait la conserver, donnant 333333,333333333313931D. Plutôt que de simplement dire «convertir en décimal», le code doit spécifier comment cette conversion doit être effectuée.
Convert.ToDecimal(double)
est la même que (decimal)doubleTotal
, sauf si elle est doubleTotal
modifiée pour un type différent, vous éviterez probablement une erreur de compilation et introduiriez une erreur d'exécution plus difficile à trouver car un ToDecimal différent le remplacement peut être appelé. L'opérateur de distribution est beaucoup plus explicite ...
Eh bien, c'est une vieille question et j'ai effectivement utilisé certaines des réponses présentées ici. Néanmoins, dans mon scénario particulier, il était possible que la double
valeur vers laquelle je voulais convertir decimal
soit souvent supérieure à decimal.MaxValue
. Donc, 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ébordement et si une telle chose se produit, vous voulez simplement garder 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.