Почему делает (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

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

14
задан mskfisher 9 May 2012 в 19:08
поделиться

2 ответа

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

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

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

30
ответ дан 1 December 2019 в 06:05
поделиться

Фактически вы выполняете целочисленное деление ( 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"
24
ответ дан 1 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: