Hay una razón.
La razón es que la forma en que se almacena el número en la memoria, en el caso del tipo de datos dobles, no permite una representación exacta del número 3600.2. Tampoco permite una representación exacta del número 0.2.
0.2 tiene una representación infinita en binario. Si desea almacenarlo en la memoria o en los registros del procesador, para realizar algunos cálculos, en su lugar, se almacena un número cercano a 0.2 con representación finita. Puede no ser evidente si ejecuta código como este.
double num = (0.2 - 0.0);
Esto es porque en este caso, todos los dígitos binarios disponibles para la representación de los números en el tipo de datos doble se utilizan para representar la parte fraccionaria del número (sólo hay la parte fraccionaria) y la precisión es mayor. Si almacena el número 3600.2 en un objeto de tipo doble, algunos dígitos se utilizan para representar la parte entera - 3600 y hay menos dígitos que representan la parte fraccionaria. La precisión es más baja y la parte fraccionaria que de hecho está almacenada en la memoria difiere de 0.2 lo suficiente, que se vuelve aparente después de la conversión de doble a cadena
Huh, lo mismo aquí. No es tu máquina – tsilb
http://stackoverflow.com/questions/1498296/net-problem-with-subtracting-double-values –
http://stackoverflow.com/questions/753948/why-is-floating-point-arithmetic-in-c -imprecise –