gpt4 book ai didi

Java 使用 Math.ceil 将整数四舍五入

转载 作者:IT老高 更新时间:2023-10-28 11:34:25 37 4
gpt4 key购买 nike

int total = (int) Math.ceil(157/32);

为什么它仍然返回 4? 157/32 = 4.90625,我需要总结一下,我环顾四周,这似乎是正确的方法。

我尝试将 total 作为 double 类型,但得到 4.0。

我做错了什么?

最佳答案

你在做157/32这是将两个整数相除,这总是导致向下取整的整数。因此 (int) Math.ceil(...)没有做任何事情。有三种可能的解决方案可以实现您想要的。我建议使用选项 1选项 2。请使用选项0

选项 0

转换 ab为双倍,您可以使用除法和 Math.ceil因为你想让它工作。但是我强烈反对使用这种方法,因为双除法可能不精确。要了解有关 double 不精确的更多信息,请参阅 this question .

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

选项 1

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

你可以 a / b如果 a 则始终为下限和 b都是整数。然后你有一个内联的 if 语句来检查你是否应该使用 ceil 而不是 floor。所以+1或+0,如果除法有余数,你需要+1。 a % 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) , 并使用 Wikipedia 中的定义和绘图: enter image description here

通过这些 floor 和 ceil 函数的图,您可以看到关系。

Floor function Ceil function

你可以看到 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 上询问.

关于Java 使用 Math.ceil 将整数四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139382/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com