Java 使用 Math.ceil 向上舍入为 int

2022-08-31 08:56:05
int total = (int) Math.ceil(157/32);

为什么它仍然返回4?,我需要四舍五入,我已经环顾四周,这似乎是正确的方法。157/32 = 4.90625

我尝试了类型,但得到了4.0。totaldouble

我做错了什么?


答案 1

您正在执行的操作是将两个整数彼此除以,这始终导致向下舍入的整数。因此,他们没有做任何事情。有三种可能的解决方案可以实现您想要的。我建议使用选项 1选项 2请不要使用选项 0157/32(int) Math.ceil(...)

选项 0

将 转换为双精度值,您可以使用除法,并根据需要使用它。但是,我强烈反对使用这种方法,因为双重划分可能不精确。要了解有关双打不精确性的更多信息,请参阅此问题abMath.ceil

int n = (int) Math.ceil((double) a / b));

备选案文1

int n = a / b + ((a % b == 0) ? 0 : 1); 

如果 和 都是整数,则始终使用 floor。然后,你有一个内联的if语句女巫检查你是否应该ceil而不是地板。所以+1或+0,如果除法有余数,你需要+1。 检查其余部分。a / baba % b == 0

备选案文2

此选项非常短,但可能对于一些不太直观的选项。我认为这种不那么直观的方法会比双重除法和比较方法更快:
请注意,这不适用于.b < 0

int n = (a + b - 1) / b;

为了减少溢出的机会,您可以使用以下命令。但是请注意,它不适用于 和 。a = 0b < 1

int n = (a - 1) / b + 1;

“不太直观的方法”背后的解释

因为在Java(和大多数其他编程语言)中除以两个整数将始终使结果落空。所以:

int a, b;
int result = a/b (is the same as floor(a/b) )

但是我们不想,但是,并使用维基百科中的定义和情节:floor(a/b)ceil(a/b)enter image description here

通过地板和天花板功能的这些图,您可以看到这种关系。

Floor functionCeil function

你可以看到.我们需要.因此,我们需要找到.如果我们采取它将是正确的(尝试一些数字,你会看到它确实如此,我发现我自己很难证明这一点)。而且,所以floor(x) <= ceil(x)floor(x + s) = ceil(x)s1/2 <= s < 11/2 <= (b-1) / b < 1

ceil(a/b) = floor(a/b + s)
          = floor(a/b + (b-1)/b)
          = floor( (a+b-1)/b) )

这不是一个真正的证据,但我希望你对它感到满意。如果有人能更好地解释它,我也会很感激。也许在MathOverflow上问它。


答案 2

157/32 是 ,这将导致 .int/intint

尝试使用双字文本 - ,即 ,这会导致 .157/32dint/doubledouble