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

Ank*_*kur 14 java floating-point division

我正在尝试计算(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);

    }
}
Run Code Online (Sandbox Code Playgroud)

打印出:

0.0

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

Jon*_*eet 30

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

float div = ((360 / 24f) / 60); // div is now 0.25
Run Code Online (Sandbox Code Playgroud)

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

  • *叹*.单形数字文字使人混淆.多态数字文字使人混淆.你不能赢. (7认同)

pol*_*nts 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;
Run Code Online (Sandbox Code Playgroud)

要进行浮点除法,至少有一个操作数需要是浮点数字类型.

float div = ((360F / 24) / 60);
float div = 15F / 60;
float div = 0.25F;
Run Code Online (Sandbox Code Playgroud)

提示:如果精度很重要,您希望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"
Run Code Online (Sandbox Code Playgroud)