Ther причина заключается в том, что только цифры, которые являются степенями 2 могут быть представлены именно с помощью простого двоичного представления ,
Отдельные цифры двоичного числа разные степени 2 и любое число, таким образом, сумма различных степеней из 2.
0.1
не соответствует степени 2 и не может быть подведен из различных степени 2. Таким образом, его можно представить только с определенной ошибкой. Вы можете найти более подробное объяснение и примеры here
Если вам нужны точные цифры, вы в основном обязаны использовать целые числа. Я не уверен в других языках, но в java существует несколько классов, предназначенных для решения именно этой проблемы для приложений, где точность важна, например, в финансовых расчетах. Наиболее часто встречающимися являются BigInteger и BigDecimal
несколько дубликатов, поиск по плавающей запятой в вопросах SO – sdcvvc