2010-10-05 17 views

Respuesta

22

No.

25.50 es una expresión independiente de tipo double, no decimal.
El compilador no verá que está tratando de asignarlo a una variable decimal e interpretarlo como un decimal.

A excepción de las expresiones lambda, métodos anónimos y el operador condicional, todas las expresiones C# tienen un tipo fijo que no depende en absoluto del contexto.

Imagine qué sucedería si el compilador hiciera lo que usted desea, y usted llamó al Math.Max(1, 2).
Math.Max tiene sobrecargas que toman int, double y decimal. ¿A cuál llamaría?

+0

@slaks: ¿cuál es la forma correcta de initiliazing un decimal? –

+2

La forma en que lo hizo, con un sufijo 'M'. – SLaks

+5

@jenny, solo para adelantarse a la siguiente pregunta, 'double d = 1/2' es igual a 0. Piense en por qué en el contexto de esta pregunta y respuesta. –

10

Hay dos conceptos importantes para entender en esta situación.

  1. Valores literales
  2. conversión implícita

Esencialmente lo que están pidiendo es si un valor literal se puede convertir implícitamente entre los 2 tipos. El compilador realmente hará esto por usted en algunos casos cuando no haya pérdida de precisión. Tome este por ejemplo:

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

Esto es posible porque un long (Int64) contiene una mayor gama de valores en comparación con un int (Int32). Para su ejemplo específico, es posible perder precisión. Aquí están los rangos drásticamente diferentes para decimal y double.

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

Con el conocimiento queda claro por qué una conversión implícita es una mala idea. Aquí hay una lista de conversiones implícitas que el compilador C# actualmente admite. Te recomiendo que hagas un poco de lectura ligera sobre el tema.

Implicit Numeric Conversions Table

+0

¡Un decimal solo puede subir a 8,121.2! Eso es 7.9 x 1028. Wow, eso no es mucho rango. (Mi manera sarcástica de decir, creo que perdiste un "^" o un superíndice allí.) – Jay

+0

@Jay - No pude dar una réplica ingeniosa a tu comentario sarcástico así que ... ¡cállate! :) – ChaosPandion

3

Tenga en cuenta también que, debido a los detalles interiores de cómo se definen dobles y decimales, ligeros errores de redondeo pueden aparecer en sus tareas o cálculos. Necesita saber cómo funcionan los flotantes, los dobles y los decimales a nivel de bits para tomar siempre las mejores decisiones.

Por ejemplo, un doble no puede almacenar con precisión el valor 25.10, pero un decimal puede.

doble puede almacenar exactamente el valor 25,50, sin embargo, por razones divertidas de codificación binaria.

Decimal structure

+0

Ah sí, es importante recordar que hay dos formas de perder datos numéricos. Magnitud y Precisión. – ChaosPandion

Cuestiones relacionadas