Por ejemplo, tengo algo como este código:
double a = 68.24; double b = 0.01; double c = a - b; c es igual a 68.22999999999999 . Y digamos que no puedo cambiar los tipos de a , b y c ( debería ser double ). Pero puedo hacer esto:
double a = 68.24; double b = 0.01; decimal _c = (decimal) a - (decimal) b; double c = (double)_c; Ahora c es 68.23 , que es lo que necesito.
Pero, ¿podría perder la precisión de la conversión de c de decimal _c si tengo diferentes valores de a y b ?
Más ampliamente, ¿cuándo double pierde su precisión? Porque, a y b en el depurador son precisos (o al menos es lo que muestra), si los convierto a decimal también son precisos. Pero operar sobre ellos de alguna manera crea un valor impreciso.
¿Sabes que si tratas de escribir 1/3 usando un punto decimal, es imposible hacerlo con precisión? Lo mismo ocurre con muchos valores binarios. Cuando trabaja con valores de coma flotante en el código, casi siempre solo tiene una aproximación del valor exacto que cree que tiene.
El tipo decimal ayuda porque usa el doble de bits para representar un rango de valores posible significativamente más pequeño (±10 28 vs ±10 300+ ). Esto nos da suficiente precisión, el error de redondeo parece desaparecer para la mayoría de las cosas (sigue ahí, es demasiado pequeño para notarlo).
Para el código de muestra en la pregunta, el compilador detecta que solo tenemos constantes y está optimizando algunas de las conversiones hacia y desde double , por lo que parece que solo trabajamos con valores decimal hasta que finalmente emitimos el resultado.
Y digamos que no puedo cambiar los tipos de a, b y c ( debería ser el doble).
Independientemente de esa declaración, si le importa la precisión del resultado, probablemente necesite decimal .
Entonces, ¿por qué usaríamos double ? Velocidad. El tipo double puede aprovechar las instrucciones matemáticas implementadas y optimizadas directamente en la CPU, lo que a veces hace que las cosas sean miles de veces más rápidas en comparación con la implementación de las operaciones matemáticas en el software.