Когда вы создаете double, значение 0.3 не может быть представлено точно.Вы можете создать BigDecimal из строки без промежуточного двойного числа, как в
new BigDecimal("0.3")
Число с плавающей запятой представляется как двоичная дробь и показатель степени.Поэтому есть некоторые числа, которые не могут быть представлены точно.Существует аналогичная проблема в базе 10 с числами, такими как 1/3, что составляет 0,333333333 ..... Любое десятичное представление 1/3 является неточным.Это происходит с РАЗЛИЧНЫМ набором дробей в двоичном коде, и 0,3 является одним из наборов, который неточен в двоичном.