Wynika to z reprezentacji typow zmiennoprzecinkowych w pamieci - komputer uzywa systemu binarnego, i niektorych liczb w nim nie da sie zaprezentowac z idealna dikladnoscia, tak samo jak w dziesietnym liczyby 1/3 = 0,6(6).
Zauwaz ze to jest ktorestam (10.?) miejsce po przecinku, wiec albo nie jest wazne tak na prawde, a jesli jest wazne, to znaczy ze Twoj program wymaga innego traktowania - uzywaj jaba.lang.BigDecimal - to jest klasa ktora jest wykorzystywana w takich sytuacjach. Pamietaj, ze tworzac obiekt BigDecimal uzywaj konstruktora string, a nie z float, bo ten float moze miec problemy z reprezentacja w pamieci, i wtedy przerobienie tego na BigDecimal bedzie juz to niedokladnosc w sobie zawierac. Innymi slowy: new BigDecimal("0.82"), a nie new BigDecimal("0.082").
Warto jeszcze nadmienic, ze nie jest to "wina Javy", c# c++ itp maja ta sama przypadlosc.