14

我正在尝试计算 (360 / 24) / 60 当我应该得到 0.25 时,我一直得到答案 0.0

用文字表示:我想将 360 除以 24,然后将结果除以 60

public class Divide {

    public static void main(String[] args){
      float div = ((360 / 24) / 60);
      System.out.println(div);

    }
}

这打印出来:

0.0

这是为什么?我是在做一些非常愚蠢的事情,还是有充分的理由这样做

4

3 回答 3

30

算术中的所有操作数都不是浮点数 - 所以这一切都是用整数算术完成的,然后转换为浮点数。如果您将适当的操作数的类型更改为浮点数,它将正常工作:

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

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

于 2010-03-19T07:38:15.670 回答
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"
于 2010-03-19T07:42:20.183 回答
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);
}
于 2012-06-06T04:23:27.630 回答