是否有任何Java函数或UTIL类以这种方式进行舍入:func(3/2)= 2?

StackOverflow https://stackoverflow.com/questions/1074228

  •  21-08-2019
  •  | 
  •  

有没有Java功能或UTIT class 这样做是这样的: func(3/2) = 2

Math.ceil() 无济于事,应该这样做。我知道 BigDecimal, ,但不需要。

有帮助吗?

解决方案

Math.ceil() 将始终圆满,但是您正在与 3/2. 。因此,由于在整数部门 3/2 = 1 (不是 1.5)天花板 11.

您需要做的才能实现所需的结果 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() ?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top