Java не отображает значения с плавающей точкой точно по умолчанию. По умолчанию отображается только достаточное количество цифр для однозначного различения значения.
Результатом этого является то, что некоторые значения могут отображаться как «0.1» и «0.2», но они имеют небольшие отличия от точно 0,1 и 0,2. Когда они добавляются, эти различия объединяются и становятся больше. Тогда сумма будет отличаться от 0,3 на столько, что для того, чтобы отличить ее от значения, отображаемого как «0,3», необходимо использовать «0,30000000000000004».
Когда 0.1
используется в исходном коде, он преобразуется в 0,1000000000000000055511151231257827021181583404541015625, которое является ближайшим значением к 0,1, которое может быть представлено в базовой 64-разрядной двоичной переменной с плавающей точкой IEEE-754. Точно так же 0.2
становится 0.200000000000000011102230246251565404236316680908203125
, а 0.3
становится
0.299999999999999988897769753748434595763683319091796875
.
Когда вы добавляете эти два значения для 0.1
и 0.2
, вычисляемый результат равен 0,3000000000000000444089209850062616169452667236328125. Поскольку это значение не равно 0,299999999999999988897769753748434595763683319091796875, его необходимо распечатать как «0.30000000000000004», чтобы его можно было различить.