¿Alguien puede explicar esto: 0.2 + 0.1 = 0.30000000000000004?

Posible duplicado:
¿Cómo se almacena el punto flotante? Cuando importa

¿Por qué ocurre lo siguiente en el intérprete de Python?

>>> 0.1+0.1+0.1-0.3 5.551115123125783e-17 >>> 0.1+0.1 0.2 >>> 0.2+0.1 0.30000000000000004 >>> 0.3-0.3 0.0 >>> 0.2+0.1 0.30000000000000004 >>> 

¿Por qué no 0.2 + 0.1 = 0.3 ?

Esto se debe a que .1 no se puede representar exactamente en una representación binaria de punto flotante. Si intentas

 >>> .1 

Python responderá con .1 porque solo imprime con cierta precisión, pero ya hay un pequeño error de redondeo. Lo mismo ocurre con .3 , pero cuando se emite

 >>> .2 + .1 0.30000000000000004 

luego se acumulan los errores de redondeo en .2 y .1 . También tenga en cuenta:

 >>> .2 + .1 == .3 False 

No todos los números de punto flotante son exactamente representables en una máquina finita. Ni 0.1 ni 0.2 son exactamente representables en el punto flotante binario. Y tampoco es 0.3.

Un número es exactamente representable si tiene la forma a / b donde a y b son enteros y b es una potencia de 2. Obviamente, el tipo de datos debe tener un significado suficientemente grande para almacenar el número también.

Recomiendo la útil página web de Rob Kennedy como una buena herramienta para explorar la representabilidad.