Es un problema estándar debido a la forma en la computadora almacena valores de coma flotante. Busque aquí el "problema de punto flotante" y encontrará toneladas de información.
En resumen: un flotador/doble no puede almacenar 0,1 con precisión. Siempre estará un poco apagado.
Puede intentar usar el tipo decimal
que almacena números en notación decimal. Por lo tanto, 0.1 será representable con precisión.
usted quería saber la razón:
flotador/doble se almacenan como fracciones binarias, no en fracciones decimales. Para ilustrar:
12.34 en notación decimal (lo que usamos) significa 1 * 10 + 2 * 10 + 3 * 10 -1 + 4 * 10 -2. La computadora almacena los números de coma flotante de la misma manera, excepto que usa la base 2: 10.01 medios 1 * 2 + 0 * 2 + 0 * 2 -1 + 1 * 2 -2
Ahora, usted probablemente sabe que hay algunos números que no pueden ser representados plenamente con nuestra notación decimal Por ejemplo, 1/3 en notación decimal es 0.3333333 ... Lo mismo sucede en la notación binaria, excepto que los números que no se pueden representar con precisión son diferentes. Entre ellos está el número 1/10. En la notación binaria que es ,000110011001100 ...
Desde la notación binaria no puede almacenar de forma precisa, se almacena de forma redondeada. De ahí tu problema.
¿Puede agregar su declaración del doble, por favor? –
http://stackoverflow.com/questions/753948/why-is-floating-point-arithmetic-in-c-imprecise –
Una lectura exhaustiva sobre el tema: [Lo que todo científico de la computación debe saber sobre la aritmética de coma flotante] (http://docs.sun.com/source/806-3568/ncg_goldberg.html) –