Es un problema basado en 2 cosas:
1- Matematicas:
0.9999... == 1
2- Binario:
Los numeros float se guardan en base-2, en vez de usar base-10. Eso significa que las matematicas que usan (usualmente) los lenguajes NO ES la que aprendiste en la escuela.
Puedes aprender mas, y es algo, junto a lo de unicode y el manejo de fechas, que TODO programador debe saber:
http://floating-point-gui.de/
Y
http://programmers.stackexchange.com...-pitfalls?rq=1