Dziwny wynik roznicy obiektow klasy Double

0

Ponizszy program:

public class obliczenia {
public static void main(String[] args) {
	double x1=8.22,x2=8.00;
	System.out.println(x1-x2);
}
}

Generuje mi taki oto wynik:

0.22000000000000064

Moje pytanie: dlaczego taki, a nie 0.22?
Potrzebuje wynikow typu 0.22, a nie czegos takiego powyzej do mojego programu.

Dzieki za wszelka pomoc.

Pozdro

0

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.

0

Dodam jeszcze, że ani 8.22, ani 8.0 nie są tymi liczbami, które sądzisz, że są. W miejscu użycia tych literałów kompilator generuje ułamkową liczbę w systemie dwójkowym, której wartość jest najbliższa oczekiwanej przez Ciebie liczbie. Liczby ułamkowe reprezentowane w komputerze mają zwykle ograniczoną dokładność - jest to kompromis między dokładnością, a wydajnością. Oprócz niedokładności samych operacji binarnych dochodzą też niedokładności konwersji między systemem dziesiętnym, a binarnym - i to w obie strony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1