是否有任何Java函数或UTIL类以这种方式进行舍入:func(3/2)= 2?
题
有没有Java功能或UTIT class
这样做是这样的: func(3/2) = 2
Math.ceil()
无济于事,应该这样做。我知道 BigDecimal
, ,但不需要。
解决方案
Math.ceil()
将始终圆满,但是您正在与 3/2
. 。因此,由于在整数部门 3/2 = 1
(不是 1.5
)天花板 1
是 1
.
您需要做的才能实现所需的结果 Math.ceil(3/2.0);
通过以两倍的数量进行分区(2.0
),您最终会进行浮点部门而不是整数部门。因此 3/2.0 = 1.5
, ,和 ceil()
的 1.5
总是 2
.
其他提示
有点黑魔法,您可以用整数来完成所有操作:
// Divide x by n rounding up
int res = (x+n-1)/n
您总是可以先施放:
Math.ceil((double)3/2)
将地板部门转换为天花板部:
(numerator + denominator-1) / denominator
将地板部门转换为四舍五入部门:
(numerator + (denominator)/2) / denominator
在Java中,3/2 = 1,因为它使用了整数划分。之后没有任何功能可以“修复”此功能。您要做的是强制浮动分区并汇总结果:
int result = (int)Math.ceil( ((float)3) / ((float)2) );
这是整数部门通常的情况?将任一数字施放到浮点类型之后,请尝试使用Math.ceil。
许多语言都这样“思考”。如果您将int分为int,则应该得到一个int(因此它们会截断,结果您会得到1个)。
我们都知道这不是真的,但这就是它们的工作方式。您可以“欺骗”它们,并做一些将其中之一铸造成双重的事情,也可以使用双重表示: Math.ceil (3.0 / 2)
或者 Math.ceil((double)3/2)
, , 如前所述。
Math.Ceil 将要 帮助,前提是您使用浮点号。问题在于,在整数部门中的3/2是1。到值到任何函数时,无论是Math.ceil还是其他功能,值都简单地1。任何落后小数部分都消失了。
if (a % b == 0)
{
return (a / b);
}
else
{
return (a / b) + 1;
}
利用整数部门做您想做的。我不知道可以做到这一点的数学功能,但是为什么不滚动呢?
下面的片段也与负整数一起工作:
public static int divRoundUp(int x, int n) {
if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")");
int ret = (x+(n-1)*(x>0?1:0))/n;
return ret;
}
我最喜欢Randy Proctor的答案。在这里更详细:
如果您想进行真实的舍入(即3/2-> 2,但17 / 7-> 2)用整数> 0:使用 (dividend + (divisor / 2)) / divisor
代替 dividend / divisor
.
如果股息可以是任何整数(即负允许):(dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor)
.
如果股息是任何整数和除数,则有任何整数,但是0:(dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor)
.
(请注意,添加和缩写可能会导致否则不会发生的环绕型,从而使结果不正确。)
这是我创建的一种方法来处理int除法,而无需使用数学回合并铸造浮动。这适用于正数和负数。它通过添加一半的分母来抵消舍入的作用
public static int div_Int(int num, int den){
if(num > 0 && den > 0 || num < 0 && den < 0 ){
return ((2*num)+ den)/(2*den);
}else{
return ((2*num)- den)/(2*den);
}
}
如果您只想除以2,可以做:
n - n / 2
总的来说:
(n - 1) / d + 1 == (n + d - 1) / d
这适用于非负整数。如何将其扩展到负整数取决于您对“这样做”的含义。整数部门朝零舍入,而 Math.ceil()
四舍五入 Math.floor()
下降。例如 n / 2 != (int) Math.floor(n / 2.0)
为了 n == -5
.
如果您想始终汇总,可以使用 Math.ceil()
如 这个答案.
如果您真的想避免使用CEIL和铸造,那么这是一种完成同一件事的方法。
public int findCeil(int X, int Y) {
if (X % Y == 0){
return X / Y;
} else {
return X / Y + 1;
}
}
你有没有尝试过 Math.floor()
?