为什么输出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以加倍?
答案 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)
。此处1
和2
将自己表示为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
方法调用。
文字1
和2
是整数。当您仅使用整数作为参数执行除法时,将执行整数除法,该除法始终向下舍入。因此,该术语将被解析为int值0
。 Math.ceil()
只接受类型double
,但这不是问题,因为Java可以自动执行转换并将int 0
转换为双0.0
。
要执行显式浮点除法,请将除法中的一个或两个参数设为浮点文字:
System.out.println((int) (Math.ceil(1.0/2.0)));