在ceil之前需要进行类型转换

时间:2014-03-06 22:15:07

标签: java

我将在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);           

2 个答案:

答案 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 / ji都是整数,j会执行整数除法。 i / j已经3,所有Math.ceil都会返回3.0,然后会再次投放到3。您希望进行浮点除法,这是在ij中的一个或两个都是浮点类型时完成的。您可以通过在进行除法之前将其中一个整数转换为double来实现此目的:

int i = 10;
int j = 3;
int k = (int)Math.ceil((double)i/j);
System.out.println(k); //outputs '4'