为什么(360/24)/ 60 = 0 ...在Java中

时间:2010-03-19 07:37:24

标签: java floating-point division

我正在尝试计算(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 个答案:

答案 0 :(得分:30)

算术中的所有操作数都不是浮点数 - 因此全部用整数运算完成,然后转换为浮点数。如果将适当的操作数的类型更改为float,它将正常工作:

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

请注意,如果你只改变了60作为一个浮点数,你最终将360/24作为整数运算执行 - 这在这种特殊情况下很好,但并不代表我怀疑你的真正意图。基本上,您需要确保以您希望的方式执行算术运算。

答案 1 :(得分: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"

答案 2 :(得分:2)

在您的主要方法中,

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