¿Por qué este cálculo simple de dos dobles es inexacto?

Posible duplicado:
C # (4): doble menos doble dando problemas de precisión

86.25 – 86.24 = 0.01

En general, creo que la afirmación anterior es cierta, ¿verdad?

Sin embargo, si entro en este

double a = 86.24; double b = 86.25; double c = b - a; 

Encuentro que c = 0.010000000000005116

¿Por qué es esto?

Los números de punto flotante (en este caso, los dobles) no pueden representar valores decimales con exactitud. Recomendaría leer el artículo de David Goldberg Lo que todo científico informático debería saber sobre la aritmética de punto flotante

Esto se aplica a todos los idiomas que tratan con números de punto flotante, ya sea C #, Java, JavaScript, … Esta es una lectura esencial para cualquier desarrollador que trabaje con aritmética de punto flotante.

Como sugiere VinayC, si necesita una representación exacta (y más lenta), use en su lugar System.Decimal (también conocido como decimal en C #).

Doble es el tipo de datos incorrecto para los cálculos decimales, use Decimal para eso. La razón principal radica en cómo el doble almacena el número; es esencialmente una aproximación binaria del número decimal.