Почему (360/24) / 60 = 0 ... в Java - PullRequest
       22

Почему (360/24) / 60 = 0 ... в Java

14 голосов
/ 19 марта 2010

Я пытаюсь вычислить (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

Почему это? Я делаю что-то действительно глупое, или есть веская причина для этого

Ответы [ 3 ]

30 голосов
/ 19 марта 2010

Ни один из операндов в арифметике не является float - так что все это делается с помощью целочисленной арифметики и , затем преобразуется в число с плавающей точкой. Если вы измените тип соответствующего операнда на тип с плавающей точкой, он будет работать нормально:

float div = ((360 / 24f) / 60); // div is now 0.25

Обратите внимание, что если вы изменили только 60 на число с плавающей точкой, вы получите 360/24, выполняемый как целочисленная арифметика - что хорошо в данном конкретном случае, но не соответствует тому, что, как я подозреваю, вы действительно намеревались , В основном вам нужно убедиться, что арифметическая операция выполняется так, как вы хотите.

24 голосов
/ 19 марта 2010

Вы на самом деле делаете целочисленное деление ( 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"
2 голосов
/ 06 июня 2012

В вашем основном методе,

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);
}
...