Java, źle wyliczana wartość dla zmiennej typu double

0

Witam,

		double kwota = 980.915;
		kwota -= 19.085;
		System.out.println(kwota);

Oczekiwany wynik to zmienna kwota przyjmująca wartość 961.83
Natomiast otrzymuję wynik 961.8299999999999

Wydaje mi się, że problem tkwi w tym zerze po przecinku (19.085), bo po zamianie zera na inną wartość wszystko jest wyliczane poprawnie, ale ja potrzebuje wyliczać różne wartości, a nie wykluczyć takie co mają "zero jako pierwsze po przecinku, czyli w tym przypadku 85/1000.

Dlaczego tak jest ta wartość wyliczana ?

0

double i float to liczby skończonej precyzji, a więc dostajesz błąd zaokrąglenia.

http://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

Najlepsze rozwiązanie, moim zdaniem, to liczenie w groszach czy tam np ułamkach groszy i trzymanie liczb w longach, dzięki czemu błędy zaokrąglenia są łatwiejsze do opanowania.

0

Obliczenia komputerowe na typach zmiennoprzecinkowych są przybliżone, musisz się z tym pogodzić.

0
Wibowit napisał(a):

double i float to liczby skończonej precyzji, a więc dostajesz błąd zaokrąglenia.

http://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

Najlepsze rozwiązanie, moim zdaniem, to liczenie w groszach czy tam np ułamkach groszy i trzymanie liczb w longach, dzięki czemu błędy zaokrąglenia są łatwiejsze do opanowania.

znalazłem już odpowiedź: BigDecimal

0

Przy BigDecimalach i tak musisz zaokrąglać przy np dzieleniu, bo inaczej może być bum. Dla przykładu: http://ideone.com/84GDhq Użycie longów byłoby prostsze, chociaż BigDecimale i tak są bezpieczniejsze.

0

Oczekiwany wynik to zmienna kwota przyjmująca wartość 961.83
Natomiast otrzymuję wynik 961.8299999999999

Używałeś trzech miejsc po przecinku.
Po zaokrągleniu wyniku do trzech miejs po przecinku wynik będzie dobry.

0

Zaokrąglać przy dzieleniu można np. tak http://ideone.com/VRnkwZ

0
Wibowit napisał(a):

Przy BigDecimalach i tak musisz zaokrąglać przy np dzieleniu, bo inaczej może być bum. Dla przykładu: http://ideone.com/84GDhq Użycie longów byłoby prostsze, chociaż BigDecimale i tak są bezpieczniejsze.

Potrzebne mi operacje to: mnożenie, dodawanie, odejmowanie
Czy przy którejś z nich występuje ten problem ?

0

Generalnie przy tych operacjach nie ma bum, ale zobacz na to: http://ideone.com/ZCuwTf Często przy mnożeniu długości się sumują, co może prowadzić do niepotrzebnie lub niebezpiecznie długich reprezentacji. A więc zaokrąglanie przy mnożeniu też jest potrzebne. Przy dodawaniu i odejmowaniu generalnie nie jest, no chyba, że dodajesz lub odejmujesz liczby o drastycznie różnej skali, np 1e100 i 1e-100.

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