Przy rzutowaniu w nawiasie piszemy typ, do którego chcemy przekonwertować wynik. Dlaczego ma znaczenie to czy zapiszę równanie w nawiasie czy nie?
Np. (część kodu):
" int a=8;
int b=3;
System.out.println("a/b="+(double)a/b); "
Jak zapiszę te 3 linijki to wyskoczy poprawny wynik (około 2.666).
A jak zapiszę w ten sposób:
" int a=8;
int b=3;
System.out.println("a/b="+(double)(a/b)); "
To będzie 2.0
Poza tym dlaczego kalkulator w Javie nie jest dokładny? Przy dzieleniu 8/3 daje 2.666666...5 (a powinno być 7 na końcu)
Dlaczego odejmując 3.16-2.51 Java "wypluwa" 0.6500000000000004 (chodzi o tę czwórkę na końcu)?
A jak działa to dzielenie (double) a/b w takim razie, że tu akurat jest poprawny wynik?
Gdy nie ma nawiasu, to on tu pojedzie sobie od lewej do prawej, więc "zobaczy", że pojawia się najpierw rzutowanie, a zatem będzie wiedział, że to co po nim następuje ma być doublem.
A jakby w takim razie napisać "(a/b) (double)" albo "a/b (double) to też by zadziałało?
Nie, to się nawet nie skompiluje, bo ta komenda wywołująca rzutowanie musi być przed rzutowanym wyrażeniem. Warto w takich sytuacjach zresztą samemu potestować różne rzeczy :)
Bo jak zrobisz nawias to najpierw policzy się po prostu a/b, które zostanie uznane za dzielenie dwóch liczb całkowitych i zostanie to przerobione na 2. Potem program użyje rzutowania, ale ponieważ będzie już rzutował po prostu samą dwójkę, to zrobi z niej tylko 2.0.
Co do dokładności - nie będziemy tu wnikać w szczegóły, ale każda taka operacja arytmetyczna przeprowadzana w ramach jakiegoś programu (zwłaszcza, gdy wynik jest jakąś liczbą niecałkowitą) cechuje się pewną dokładnością, ma to związek m.in. z tym, że określona ilość pamięci komputera jest przeznaczana na przechowywanie takiego wyniku i dlatego np. na którymś miejscu po przecinku (jak widać dość daleko) może się pojawić pewna niedokładność. Natomiast te wyniki, gdybyśmy się ograniczyli do w praktyce bardziej przydatnych np. kilku miejsc po przecinku są oczywiście dobre.