java math.ceil没用_Java使用Math.ceil舍入到一个int

你正在做157/32,它将两个整数相互分割,这总是产生一个向下舍入的整数。因此,(int)Math.ceil(…)没有做任何事情。有三种可能的解决方案来实现你想要的。我建议使用选项1或选项2.请不要使用选项0。

选项0

将a和b转换为双精度,你可以使用除法和Math.ceil,因为你希望它工作。然而,我强烈反对使用这种方法,因为双重划分可能不精确。

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

选项1

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

如果a和b都是整数,则a / b与总是floor。然后你有一个内联if语句女巫检查你是否应该ceil而不是floor。所以1或0,如果有除法的余数你需要1. a%b == 0检查余数。

选项2

这个选项非常短,但也许有些不太直观。我认为这种不太直观的方法将比双分法和比较方法更快:

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),并使用Wikipedia的定义和图:

有了这些地板和ceil功能的地块,你可以看到的关系。

您可以看到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问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值