2010-10-05 7 views

Répondre

22

No.

25.50 est une expression autonome de type double, pas decimal.
Le compilateur ne verra pas que vous essayez de l'affecter à une variable decimal et l'interpréter comme une décimale. A l'exception des expressions lambda, des méthodes anonymes et de l'opérateur conditionnel, toutes les expressions C# ont un type fixe qui ne dépend absolument pas du contexte. Imaginez ce qui se passerait si le compilateur faisait ce que vous vouliez, et vous appeliez Math.Max(1, 2).
Math.Max a des surcharges qui prennent int, double et decimal. Lequel s'appellerait-il?

+0

@slaks: Quelle est la bonne façon de initiliazing une décimale? –

+2

Comme vous l'avez fait, avec un suffixe 'M'. – SLaks

+5

@jenny, juste pour devancer la question suivante, 'double d = 1/2' est égal à 0. Pensez à la raison pour laquelle dans le contexte de cette question et réponse. –

10

Il y a deux concepts importants à comprendre dans cette situation.

  1. Littéraux
  2. de conversion Implicit

Essentiellement ce que vous demandez est de savoir si une valeur littérale peut être convertie implicitement entre 2 types. Le compilateur va le faire pour vous dans certains cas où il n'y aurait pas de perte de précision. Prenez ceci par exemple:

long n = 1000; // Assign an Int32 literal to an Int64. 

Ceci est possible parce qu'un long (Int64) contient une plus grande plage de valeurs par rapport à un int (Int32). Pour votre exemple spécifique, il est possible de perdre la précision. Voici les plages radicalement différentes pour decimal et double.

 
Decimal: ±1.0 × 10−28 to ±7.9 × 1028 
Double: ±5.0 × 10−324 to ±1.7 × 10308 

Avec la connaissance, il devient clair pourquoi une conversion implicite est une mauvaise idée. Voici une liste des conversions implicites que le compilateur C# supporte actuellement. Je vous recommande fortement de faire un peu de lecture sur le sujet.

Implicit Numeric Conversions Table

+0

Un nombre décimal ne peut aller que jusqu'à 8 121,2? C'est 7,9 x 1028. Wow, ce n'est pas beaucoup de portée. (Ma façon de dire, je pense que vous avez perdu un "^" ou un exposant là-dedans.) – Jay

+0

@Jay - Je n'ai pas réussi à trouver une réponse intelligente à votre remarque sarcastique alors ... tais-toi! :) – ChaosPandion

3

Notez également qu'en raison des détails internes de la façon dont les doubles et les décimales sont définies, quelques erreurs d'arrondi peuvent apparaître dans vos missions ou calculs. Vous devez savoir comment les flotteurs, les doubles et les décimales fonctionnent au niveau des bits pour toujours faire les meilleurs choix.

Par exemple, un double ne peut pas stocker avec précision la valeur 25.10, mais une boîte décimale.

Un double peut stocker exactement la valeur 25,50 cependant, pour des raisons de codage binaire amusantes.

Decimal structure

+0

Ah oui, il est important de se rappeler qu'il existe deux façons de perdre des données numériques. Magnitude et précision. – ChaosPandion