Hay una laaaaarga explicación basada en la inexactitud de la representación de numeros que pueden tener infinitos dígitos en un número de digitos finito ...
http://www.ibm.com/developerworks/ja...ary/j-jtp0114/
Pero la respuesta corta es: Si quieres precision con numeros de coma flotante en Java, usa BigDecimal y BigInteger. F/float y D/double tienen precisión muy limitada.
S!