Почему в Java такие выражения, как эти два выдают разные значения?
double wes = earthWeight * 17 / 100;
double wes = earthWeight * 17.0 / 100;
Ведь это по сути одно и тоже, а вот разница уже большая...
Ilia Fesenko
5 уровень
Разница в переменных
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
MikhailJava Developer в -
28 ноября 2019, 16:01
Во втором случае вы совершили явное приведение к дробному типу и на последней операции получаете дробный ответ.
В первом случае вычисления выполняются с помощью слагаемых целочисленного типа и в ответе отбрасывается дробная часть.
В любом случае почитайте про тему "Приведение типов", сразу все станет понятным.
+1
JustinianJudge в Mega City OneMaster
28 ноября 2019, 00:23решение
Это по сути совершенно разные вещи.
Есть вещественные числа, есть целые числа.
17 это целое число.
17.0 это вещественное число, поскольку имеет дробную часть.
В джаве, есть такая штука, которая называется литералы. Если в джава-коде есть выражение, в котором есть число без явного указания дробной части, то такое число является целым и автоматически считается компилятором как int - примитив, который хранит целочисленные данные.
То есть
нам закономерно даст 2. Поскольку это два целочисленных типа НЕ ИМЕЮЩИХ дробной части. А сколько раз двойка без дробей содержится в пятерке? Два раза. Вот и будет ответ 2. Правда если мы будем записывать этот результат в переменную double , то будет приведение типов к вещественным числам, и добавится .0, то есть будет 2.0.
А вот если мы сделаем так:
или
мы ЯВНО даем компилятору понять, что мы хотим получить результат именно с учетом дробной части.
Если компилятор видит выражение, где одно число int, а другое double то чтобы не терять точность вычислений, результат будет double, то есть с дробной частью - 2.5.
Если компилятор видит, что типы int, числа не имеют дробной части, компилятор резонно воспринимает это как сигнал от программиста - "мне не нужна точность и дробная часть".
Это нужно запомнить и принять как данное. У этого есть свои обоснования, поскольку в большинстве случаев, нам действительно не нужна дробная часть, а если нужна то мы явно говорим компилятору об этом. Да и это логично что, результатом операции int к int тоже будет int. А то была бы жесть.
int a = 2 + 2;
мы написать можем
int b = 6 / 3;
мы написать можем.
А вот так:
int c = 6 / 4;
уже нет. Была бы чехарда в коде
+2
IceBergMaster
28 ноября 2019, 00:18
int / int - результат будет int.
0