Я пытаюсь вычислить (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
Почему это? Я делаю что-то действительно глупое, или являюсь там серьезным основанием для этого
Ни один из операндов в арифметике не является числом с плавающей запятой, поэтому все это делается с помощью целочисленной арифметики, а затем затем преобразуется в число с плавающей запятой. Если вы измените тип соответствующего операнда на float, он будет работать нормально:
float div = ((360 / 24f) / 60); // div is now 0.25
Обратите внимание, что если вы измените только 60 на float, вы закончите тем, что 360/24 будет выполняться как целочисленная арифметика - что нормально в данном конкретном случае, но не соответствует тому, что, как я подозреваю, вы действительно задумывали. В основном вам нужно убедиться, что арифметические операции выполняются так, как вы хотите.
Фактически вы выполняете целочисленное деление ( 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"