Почему (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);
}