Java 需要在ceil之前进行打字

Java 需要在ceil之前进行打字,java,Java,我正在用Java编写以下代码: public float a1 = 0.10f; int Increments; if(TotalTime > 0) { Increments = (int) ceil(TotalTime / Increment1); amount = round(Increments * a1, 4);

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

因为
Math.ceil
(我想这是一个静态导入)返回一个
double
。在对转换后的值进行限制时(通过转换为精度较低的类型),需要显式地进行转换

另外,请注意,传递给
ceil
的参数是两个整数的比率,这也是一个整数。所以你有失去精确性的危险。此外,将
ceil
应用于整数是多余的,因为它将返回该整数本身。最后一句话:
ceil
需要一个
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
中的一种或两种都是浮点类型时进行的。在进行除法之前,可以通过将其中一个整数转换为双精度来实现这一点:

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

ceil
Math.ceil()
或您编写的函数一样?您正在执行整数除法,因此此结果将不起任何作用,您将保留除法的结果。@C.B.是的,这是
导入静态java.lang.Math.ceil中的
Math.ceil()
函数
@ZouZou那么,
(int)
是必需的吗?@John执行除法时,需要将其中一个参数转换为double。例:
(双精度)总时间/增量1