Java 使用 Math.ceil 向上舍入为 int
int total = (int) Math.ceil(157/32);
为什么它仍然返回4?,我需要四舍五入,我已经环顾四周,这似乎是正确的方法。157/32 = 4.90625
我尝试了类型,但得到了4.0。total
double
我做错了什么?
int total = (int) Math.ceil(157/32);
为什么它仍然返回4?,我需要四舍五入,我已经环顾四周,这似乎是正确的方法。157/32 = 4.90625
我尝试了类型,但得到了4.0。total
double
我做错了什么?
您正在执行的操作是将两个整数彼此除以,这始终导致向下舍入的整数。因此,他们没有做任何事情。有三种可能的解决方案可以实现您想要的。我建议使用选项 1 或选项 2。请不要使用选项 0。157/32
(int) Math.ceil(...)
将 转换为双精度值,您可以使用除法,并根据需要使用它。但是,我强烈反对使用这种方法,因为双重划分可能不精确。要了解有关双打不精确性的更多信息,请参阅此问题。a
b
Math.ceil
int n = (int) Math.ceil((double) a / b));
int n = a / b + ((a % b == 0) ? 0 : 1);
如果 和 都是整数,则始终使用 floor。然后,你有一个内联的if语句女巫检查你是否应该ceil而不是地板。所以+1或+0,如果除法有余数,你需要+1。 检查其余部分。a / b
a
b
a % b == 0
此选项非常短,但可能对于一些不太直观的选项。我认为这种不那么直观的方法会比双重除法和比较方法更快:
请注意,这不适用于.b < 0
int n = (a + b - 1) / b;
为了减少溢出的机会,您可以使用以下命令。但是请注意,它不适用于 和 。a = 0
b < 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)
通过地板和天花板功能的这些图,您可以看到这种关系。
你可以看到.我们需要.因此,我们需要找到.如果我们采取它将是正确的(尝试一些数字,你会看到它确实如此,我发现我自己很难证明这一点)。而且,所以floor(x) <= ceil(x)
floor(x + s) = ceil(x)
s
1/2 <= s < 1
1/2 <= (b-1) / b < 1
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
这不是一个真正的证据,但我希望你对它感到满意。如果有人能更好地解释它,我也会很感激。也许在MathOverflow上问它。
157/32 是 ,这将导致 .int/int
int
尝试使用双字文本 - ,即 ,这会导致 .157/32d
int/double
double