我将在Java中查看以下代码:
public float a1 = 0.10f;
int Increments;
if(TotalTime > 0)
{
Increments = (int) ceil(TotalTime / Increment1);
amount = round(Increments * a1, 4);
}
Where,
TotalTime and Increment1 are integers
我的问题是,为什么我们需要在ceil
之前将整数转换为整数,如上面的代码行所示?
Increments = (int) ceil(TotalTime / Increment1);
答案 0 :(得分:0)
因为Math.ceil
(我认为它是静态导入),返回double
。当您对转换后的值进行限制时(通过转换为不太精确的类型),您需要明确地进行转换。
另外,请注意,传递给ceil
的参数是两个整数的比率,也是一个整数。所以你有失去精确度的危险。此外,将ceil
应用于整数是多余的,因为它将返回该整数本身。最后一句话:ceil
期望double
为其参数。在这种情况下,您传递int
,但转换是隐式完成的,因为它是从较不精确的类型到更精确的类型完成的。
答案 1 :(得分:0)
原因是Math.ceil
returns a double
。您无法隐式地从double
投射到int
。试图编译这个:
double d = 2.1;
int i = d;
给你:
dur.java:4: possible loss of precision
found : double
required: int
int i = d;
^
1 error
正如错误消息所述,原因是您可能会失去精度,因此编译器希望确保您确实希望允许此丢失。您可以通过显式转换来实现此目的:
int i = (int)d;
请注意,即便如此,您的代码也无法达到预期效果。
int i = 10;
int j = 3;
int k = (int)Math.ceil(i/j);
System.out.println(k); //outputs '3'
原因是如果i / j
和i
都是整数,j
会执行整数除法。 i / j
已经3
,所有Math.ceil
都会返回3.0
,然后会再次投放到3
。您希望进行浮点除法,这是在i
和j
中的一个或两个都是浮点类型时完成的。您可以通过在进行除法之前将其中一个整数转换为double来实现此目的:
int i = 10;
int j = 3;
int k = (int)Math.ceil((double)i/j);
System.out.println(k); //outputs '4'