@TomRiddle: musiałem post dołożyć, bo 580 znaków to za mało na mój wywód :)
Zgoda, dokładność w przykładzie 0.3d + 0.6d jest tracona na n-tym miejscu, ale ma wpływ na wynik już na 1 miejscu po przecinku.
Jak dodaję na zwykłym kalkulatorze dwie liczby rzeczywiste jak w podanym przykładzie to oczekuję wyniku 0.9, a nie 0.899999... no to jeszcze sobie zaokrąglę w górę, bo kalkulator jest niedokładny.
W sytuacji gdzie robię kilkanaście takich operacji i jeszcze trzeba coś podzielić lub odliczyć procenty to ta dokładność spada. Zrobię testy i będą się zgadzać.
Ale wezmę kartkę papieru, ołówek i kalkulator i okazuje się, że wynik policzony ręcznie różni się od tego z programu.
Chodzi mi o to, że był to spory problem w branży bankowej, gdzie takich operacji jest wykonywanych miliardy miesięcznie. I teraz jak pogodzić fakt, że aplikacja jednemu dodała milion razy po 0.0003 złotego? Kto ma to zapłacić? Bank czy może inni klienci?
Dlatego do takich obliczeń został stworzony BigDecimal, który na dokładności nie traci i jest używany w produkcji, zamiast double czy float.
Do sedna: w powyższym przykładzie klasy, pole cena powinno być BigDecimal, zamiast int (bo nikt nie podaje tak ceny, bo zwykle jest 0.99 na końcu) i niedokładnego double/float.