Jest to technicznie zależne od języka, ale prawie wszystkie języki traktują ten temat tak samo. Gdy występuje niezgodność typów między dwoma typami danych w wyrażeniu, większość języków będzie próbować rzutować dane po jednej stronie=
aby dopasować dane po drugiej stronie, zgodnie z zestawem wstępnie zdefiniowanych reguł.
Podczas dzielenia dwóch liczb tego samego typu (liczby całkowite, liczby podwójne itp.) Wynik będzie zawsze tego samego typu (więc „int / int” zawsze da w wyniku int).
W tym przypadku masz,
double var = integer result
który rzuca wynik w postaci liczby całkowitej na podwójny po obliczeniu, w którym to przypadku dane ułamkowe są już utracone. (większość języków wykonuje to rzutowanie, aby zapobiec niedokładnościom typu bez zgłaszania wyjątku lub błędu).
Jeśli chcesz, aby wynik był podwójny, będziesz chciał stworzyć sytuację, w której masz
double var = double result
Najłatwiej to zrobić, wymuszając podwojenie wyrażenia po prawej stronie równania:
c = a/(double)b
Dzielenie liczby całkowitej i podwójnej spowoduje rzutowanie liczby całkowitej na podwójną (zwróć uwagę, że podczas obliczeń matematycznych kompilator często „upcast” do najbardziej specyficznego typu danych, aby zapobiec utracie danych).
Po upcastingu a
skończy się jako dublet, a teraz masz podział na dwie pary. Stworzy to pożądany podział i przypisanie.
PONOWNIE, proszę zauważyć, że jest to specyficzne dla języka (i może nawet być specyficzne dla kompilatora), jednak prawie wszystkie języki (z pewnością wszystkie te, które przychodzą mi do głowy) traktują ten przykład identycznie.