Java Ceil古怪

时间:2014-12-29 06:55:16

标签: java

为什么输出0而不是1?

System.out.println((int) (Math.ceil(1/2)));

虽然这个正确输出1

System.out.println((int) (Math.ceil((double) 1/ (double) 2)));

不应Math.ceil(double)自动键入1/2以加倍?

3 个答案:

答案 0 :(得分:5)

确实,

Math.ceil将整数转换为double。但是只有之后才执行整数运算。这是操作的顺序:

int a = 1;
int b = 2;
int c = a / b; // now equals 0, because it's an integer operation.
double d = (double)c; // now it's a double - but equals 0.0.
double e = Math.ceil(d); // still 0.0.

您认为1/2只是一小部分,但事实并非如此 - 它是两个int的表达式和必须解决的运算符在其值可以用于进一步的表达式之前。

答案 1 :(得分:1)

显式转换始终需要提及(datatype)。此处12将自己表示为int,并且从int投射到double将引入显式投射。每当从低级到高级数据类型执行强制转换时,应强制执行 。见下面的例子;

public class MainClass{
    public static void main(String[] argv){
        int a = 100;
        long b = a; // Implicit cast, an int value always fits in a long
    }
}

显式演员表如下所示:

public class MainClass{
    public static void main(String[] argv){
        float a = 100.001f;
        int b = (int)a; // Explicit cast, the float could lose info
    }
}

代码段:Source

答案 2 :(得分:1)

执行该行时发生的第一件事是分割1/2已解决。发生这种情况时,不需要考虑它嵌入的Math.ceil方法调用。

文字12是整数。当您仅使用整数作为参数执行除法时,将执行整数除法,该除法始终向下舍入。因此,该术语将被解析为int值0Math.ceil()只接受类型double,但这不是问题,因为Java可以自动执行转换并将int 0转换为双0.0

要执行显式浮点除法,请将除法中的一个或两个参数设为浮点文字:

System.out.println((int) (Math.ceil(1.0/2.0)));