В микропроцессоре дробные числа представлены как 1/2 + 1/4 + 1/8 и так далее, то бишь приближенно и для некоторых чисел выходит погрешность в самом конце. Так что округляй всегда и будет тебе счастье
Так и должно быть. Десятичные дробные числа иногда не имеют точного двоичного представления. Надо округлять при выводе указанием формата. Еще можно использовать BigDecimal вместо double, но это громоздко и медленней работает.