Java 需要在ceil之前进行打字
我正在用Java编写以下代码: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);
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