21

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

Math.ceil()没有帮助,按名称应该这样做。我知道BigDecimal,但不需要它。

4

15 回答 15

55

Math.ceil()将始终四舍五入,但是您正在使用 . 进行整数除法3/2。因此,因为在整数除法3/2 = 1(不是1.5)中,上限11

为了达到你想要的结果,你需要做的是Math.ceil(3/2.0);

通过双倍除法 ( 2.0),您最终会进行浮点除法而不是整数除法。因此3/2.0 = 1.5,和永远ceil()是。1.52

于 2009-07-02T13:09:18.590 回答
49

一点黑魔法,你可以用整数做到这一切:

// Divide x by n rounding up
int res = (x+n-1)/n
于 2009-07-02T13:11:28.790 回答
14

要将楼面分割转换为天花板分割:

(numerator + denominator-1) / denominator

要将底除法转换为舍入除法:

(numerator + (denominator)/2) / denominator
于 2009-07-02T13:24:24.940 回答
12

你总是可以先施法:

Math.ceil((double)3/2)
于 2009-07-02T13:08:19.077 回答
5

在 Java 中,3/2 = 1 因为它使用整数除法。之后没有任何功能可以“修复”这个问题。你需要做的是强制浮动除法并四舍五入结果:

int result = (int)Math.ceil( ((float)3) / ((float)2) );
于 2009-07-02T13:11:40.863 回答
4

这不是整数除法的常见情况吗?在将任一数字转换为浮点类型后尝试 Math.Ceil。

于 2009-07-02T13:08:16.173 回答
3

许多语言都是这样“思考”的。如果你将一个 int 划分为一个 int,那么你应该得到一个 int(所以它们会被截断,结果你得到 1)。

我们都知道这不是真的,但这就是他们的工作方式。您可以“欺骗”它们,并执行一些操作,例如将其中一个转换为双精度,或使用双精度表示:Math.ceil (3.0 / 2)Math.ceil((double)3/2),如前所述。

于 2009-07-02T13:12:07.120 回答
2

如果您使用浮点数,Math.ceil会有所帮助。问题是整数除法中的 3/2 是 1。当值到达任何函数时,无论是 Math.ceil 还是其他函数,该值都只是 1。任何尾随小数部分都消失了。

于 2009-07-02T13:10:13.393 回答
1
if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

利用整数除法来做你想做的事。我不知道这样做的数学函数,但为什么不自己动手呢?

于 2009-07-02T13:13:39.690 回答
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;
}
于 2011-01-13T11:35:55.703 回答
1

如果你只想除以 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

于 2017-07-28T20:08:44.510 回答
1

如果你真的想避免使用 ceil 和 cast,这里有一个小方法可以完成同样的事情。

public int findCeil(int X, int Y) {
        if (X % Y == 0){
            return X / Y;
        } else {
            return X / Y + 1;
        }
    }
于 2018-07-13T09:21:49.287 回答
0

我最喜欢 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)

(请注意,加法和减法可能会导致回绕,否则不会发生,从而导致结果不正确。)

于 2011-07-27T16:51:24.877 回答
0

这是我创建的一种方法来处理 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);
    }

}
于 2013-05-13T00:25:11.403 回答
-4

你试过Math.floor()吗?

于 2009-07-02T13:11:38.087 回答