是否有任何 Java 函数或 utilclass
以这种方式进行舍入: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
要将楼面分割转换为天花板分割:
(numerator + denominator-1) / denominator
要将底除法转换为舍入除法:
(numerator + (denominator)/2) / denominator
你总是可以先施法:
Math.ceil((double)3/2)
在 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;
}
如果你只想除以 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()
as in this answer。
如果你真的想避免使用 ceil 和 cast,这里有一个小方法可以完成同样的事情。
public int findCeil(int X, int Y) {
if (X % Y == 0){
return X / Y;
} else {
return X / Y + 1;
}
}
我最喜欢 Randy Proctor 的回答。这里更详细:
如果您想对整数 > 0 进行真正的舍入(即 3/2 -> 2,但 17 / 7 -> 2):使用(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 除法,而无需使用 Math Round 和强制转换为浮点数。这适用于正数和负数。它通过添加一半的分母来抵消四舍五入
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);
}
}
你试过Math.floor()
吗?