double
и float
арифметика никогда не будет точно правильной из-за округления, которое происходит "под капотом".
По существу, удваивается, и числа с плавающей запятой могут иметь бесконечное количество знаков после запятой, но в памятиони должны быть представлены некоторым действительным числом битов.Поэтому, когда вы выполняете эту десятичную арифметику, происходит процедура округления, которая часто отключается на очень небольшую величину, если принять во внимание все десятичные дроби.
Как предлагалось ранее, если вам нужны полностью точные значения, используйте BigDecimal
который хранит свои значения по-разному. Вот API