La conversión de un número decimal a doble en C # da como resultado una diferencia

Resumen del problema:

Para algunos valores decimales, cuando convertimos el tipo de decimal a doble, se agrega una pequeña fracción al resultado.

Lo que lo empeora es que puede haber dos valores decimales "iguales" que resultan en valores dobles diferentes cuando se convierten.

Ejemplo de código:

decimal dcm = 8224055000.0000000000m;  // dcm = 8224055000
double dbl = Convert.ToDouble(dcm);    // dbl = 8224055000.000001

decimal dcm2 = Convert.ToDecimal(dbl); // dcm2 = 8224055000
double dbl2 = Convert.ToDouble(dcm2);  // dbl2 = 8224055000.0

decimal deltaDcm = dcm2 - dcm;         // deltaDcm = 0
double deltaDbl = dbl2 - dbl;          // deltaDbl = -0.00000095367431640625

Mira los resultados en los comentarios. Los resultados se copian del reloj del depurador. Los números que producen este efecto tienen muchos menos dígitos decimales que el límite de los tipos de datos, por lo que no puede ser un desbordamiento (¡supongo!).

Lo que lo hace mucho más interesante es que puede haber dosigual valores decimales (en el ejemplo de código anterior, vea "dcm" y "dcm2", con "deltaDcm" igual a cero) que resulta endiferente valores dobles cuando se convierten. (En el código, "dbl" y "dbl2", que tienen un "deltaDbl" distinto de cero)

Supongo que debería ser algo relacionado con la diferencia en la representación a nivel de bits de los números en los dos tipos de datos, ¡pero no puedo averiguar qué! Y necesito saber qué hacer para hacer la conversión de la manera que necesito que sea. (como dcm2 -> dbl2)

Respuestas a la pregunta(5)

Su respuesta a la pregunta