在Java类上工作,它让我疯狂,因为这个表达式正在评估为零,我需要它来计算为double,然后将其向下舍入到最接近的int。所以我想要获得的是几天的时间,但是当我通过java运行它时,它的计算结果为0.当我通过计算器运行它时,它会计算出正确的值。我会喜欢修复和解释为什么我已经拥有的东西不起作用。
public int getEventDays(){
//variables
double daysCalc;
int days;
//logic
if (getStatus().equals("filling")){
//this is indented less to fit everything on one line, its not this way in
//the fractions are for unit conversion
daysCalc= Math.floor(((capacity-storage)/(inflow-outflow))*(43560)*(1/3600)*(1/24));
days = (int)daysCalc;
}
else if (getStatus().equals("emptying")){
//this is indented less to fit everything
//the fractions are for unit conversion
daysCalc=Math.floor(((storage-0)/(outflow-inflow))*(43560)*(1/3600)*(1/24));
days = (int)daysCalc;
}
else{
days = -1;
}
return days;
}
答案 0 :(得分:3)
将您的代码更改为:
daysCalc = Math.floor(((storage-0)/(outflow-inflow))*(43560)*(1.0/3600)*(1.0/24));
<强>解释强>:
右手表达式返回一个整数值。在您的情况下,1/3600舍入为0,类似于1/24的情况。 现在通过使用1.0而不是1,它给出了未填充的浮点值1/3600。
答案 1 :(得分:1)
您的问题与表达式中的操作顺序有关。 1/3600
和1/24
周围的括号会导致首先计算这些表达式 - 由于这些除法中的每一个在除法的任一侧都有一个整数类型的表达式,因此它被视为整数除法。换句话说,1/3600
和1/24
都被计算为整数,结果为零。这意味着你的算术包括几个乘以零,这就是你的结果为零的原因。
最简单的解决方法是要理解,乘以某个数的倒数与除以该数相同。换句话说,您可以将计算简化为
daysCalc = Math.floor( storage / ( outflow - inflow ) * 43560 / 3600 / 24 );
如果storage
,outflow
和inflow
不是全部,那么将提供正确的结果。
另一方面,如果storage
,outflow
和inflow
都是整数,那么您需要确保第一个除法也不被视为整数除法。你可以写
daysCalc = Math.floor((double) storage / ( outflow - inflow ) * 43560 / 3600 / 24 );
强制使用浮点运算进行除法;此后,每个部门都以浮点完成。