Java Ceil怪诞

Java Ceil怪诞,java,Java,为什么输出0而不是1 System.out.println((int) (Math.ceil(1/2))); 而这一个正确的输出1 System.out.println((int) (Math.ceil((double) 1/ (double) 2))); Math.ceildouble不应该自动将1/2类型转换为双精度吗?显式转换总是需要提到数据类型。这里,1和2将自身表示为int,并将介绍从int转换为双显式转换。当从较低数据类型到较高数据类型进行转换时,应强制执行显式转换。见下面的例子

为什么输出0而不是1

System.out.println((int) (Math.ceil(1/2)));
而这一个正确的输出1

System.out.println((int) (Math.ceil((double) 1/ (double) 2)));
Math.ceildouble不应该自动将1/2类型转换为双精度吗?

显式转换总是需要提到数据类型。这里,1和2将自身表示为int,并将介绍从int转换为双显式转换。当从较低数据类型到较高数据类型进行转换时,应强制执行显式转换。见下面的例子

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
    }
}
代码片段:

Math.ceil确实将整数转换为双精度。但它只有在执行整数运算后才会这样做。这是操作顺序:

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是一个分数,但它不是-它是一个两个整数的表达式和一个运算符,必须先解析它的值才能在进一步的表达式中使用。

执行该行时发生的第一件事是,1/2除法被解析。发生这种情况时,不考虑对Math.ceil的方法调用,它被嵌入其中

文本1和2是整数。当执行仅以整数作为参数的除法时,将执行整数除法,该除法总是向下舍入。因此,该项被解析为int值0。只接受double类型,但这不是问题,因为Java可以自动执行转换并将int 0转换为double 0.0

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

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

你做过整数除法吗?1/2=0使用纯整数除法,尽管您可能不知道这部分数学知识。如果您真的想大惊小怪,请尝试以下方法:System.out.printlint Math.ceil1.0/2.0;