Почему (360/24)/60 = 0... в Java
Я пытаюсь вычислить (360/24)/60 Я все время получаю ответ 0.0, когда мне нужно получить 0.25
В словах: я хочу разделить 360 на 24, а затем разделить результат на 60
public class Divide {
public static void main(String[] args){
float div = ((360 / 24) / 60);
System.out.println(div);
}
}
Это выдает:
0,0
Почему? Я делаю что-то действительно глупое, или есть веская причина для этого.
Ответы
Ответ 1
Ни один из операндов в арифметике не является float, поэтому все выполняется с целочисленной арифметикой, а затем преобразуется в float. Если вы измените тип соответствующего операнда на float, он будет работать нормально:
float div = ((360 / 24f) / 60); // div is now 0.25
Обратите внимание, что если вы изменили только 60 на float, вы закончите работу с 360/24 как целочисленную арифметику - это хорошо в этом конкретном случае, но не отражает то, что, как я подозреваю, вы действительно намеревались, В основном вам нужно убедиться, что арифметическая операция выполняется так, как вы хотите.
Ответ 2
Фактически вы выполняете целочисленное деление (JLS 15.17.2).
float div = ((360 / 24) / 60);
float div = (float) ((360 / 24) / 60);
float div = (float) (15 / 60);
float div = (float) (0);
float div = 0F;
Чтобы выполнить деление с плавающей запятой, по крайней мере один из операндов должен быть числовым типом с плавающей запятой.
float div = ((360F / 24) / 60);
float div = 15F / 60;
float div = 0.25F;
Совет. Если точность важна, вы хотите выполнить столько же вычислений с помощью double
, прежде чем перейти к float
. Фактически, если ваше профилирование не показывает, что вам абсолютно необходимо float
, вы всегда должны предпочесть double
.
float f;
f = (1E-17F * 1E-17F);
System.out.println(f); // prints "9.999999E-35"
f = (float) (1E-17D * 1E-17D);
System.out.println(f); // prints "1.0E-34"
Ответ 3
В вашем основном методе
public static void main(String[] args){
float div = ((360 / 24) / 60);
System.out.println(div);
}
Обратите внимание, что 360, 24 и 60 являются целыми значениями. Таким образом вы получите странные значения.
360/24 → 15 (отлично)
15/60 → 0,4 (с плавающей запятой)
К сожалению, для вас числа с плавающей запятой усекаются, вы получаете:
-> 0 (integer value)
Затем, назначив 0 переменной с плавающей запятой, вы измените значение 0 на значение с плавающей запятой 0.0. Таким образом, результат.
Если вы хотите их разделить, вам нужно изменить их на значения с плавающей запятой.
Правильный код должен быть таким:
public static void main(String[] args){
float div = ((360.0 / 24.0) / 60.0);
System.out.println(div);
}