我想确保整数的除法在必要时总是四舍五入。还有比这更好的办法吗?有很多演员都在选角。: -)
(int)Math.Ceiling((double)myInt1 / myInt2)
我想确保整数的除法在必要时总是四舍五入。还有比这更好的办法吗?有很多演员都在选角。: -)
(int)Math.Ceiling((double)myInt1 / myInt2)
当前回答
这里所有解决方案的问题要么是它们需要强制转换,要么是它们有一个数值问题。转换为float或double总是一种选择,但我们可以做得更好。
当您使用来自@jerryjvl的答案代码时
int div = myInt1 / myInt2;
if ((div >= 0) && (myInt1 % myInt2 != 0))
div++;
有一个舍入误差。1 / 5会四舍五入,因为1% 5 != 0。但这是错误的,因为只有当用3替换1时才会发生舍入,所以结果是0.6。当计算给我们的值大于或等于0.5时,我们需要找到一种方法来四舍五入。上面例子中的模运算符的结果范围从0到myInt2-1。只有当余数大于除数的50%时,才会进行舍入运算。调整后的代码是这样的:
int div = myInt1 / myInt2;
if (myInt1 % myInt2 >= myInt2 / 2)
div++;
当然,我们在myInt2 / 2也有一个舍入问题,但是这个结果将为您提供一个比这个站点上其他结果更好的舍入解决方案。
其他回答
使用扩展方法的绝佳机会:
public static class Int32Methods
{
public static int DivideByAndRoundUp(this int number, int divideBy)
{
return (int)Math.Ceiling((float)number / (float)divideBy);
}
}
这使得你的代码超级可读:
int result = myInt.DivideByAndRoundUp(4);
上面的一些答案使用浮动,这是低效的,真的没有必要。对于无符号整数,这是int1/int2的有效答案:
(int1 == 0) ? 0 : (int1 - 1) / int2 + 1;
对于有符号int型,这是不正确的
您可以编写一个helper。
static int DivideRoundUp(int p1, int p2) {
return (int)Math.Ceiling((double)p1 / p2);
}
这里所有解决方案的问题要么是它们需要强制转换,要么是它们有一个数值问题。转换为float或double总是一种选择,但我们可以做得更好。
当您使用来自@jerryjvl的答案代码时
int div = myInt1 / myInt2;
if ((div >= 0) && (myInt1 % myInt2 != 0))
div++;
有一个舍入误差。1 / 5会四舍五入,因为1% 5 != 0。但这是错误的,因为只有当用3替换1时才会发生舍入,所以结果是0.6。当计算给我们的值大于或等于0.5时,我们需要找到一种方法来四舍五入。上面例子中的模运算符的结果范围从0到myInt2-1。只有当余数大于除数的50%时,才会进行舍入运算。调整后的代码是这样的:
int div = myInt1 / myInt2;
if (myInt1 % myInt2 >= myInt2 / 2)
div++;
当然,我们在myInt2 / 2也有一个舍入问题,但是这个结果将为您提供一个比这个站点上其他结果更好的舍入解决方案。
到目前为止,这里所有的答案似乎都过于复杂。
在c#和Java中,对于正的被除数和除数,你只需要做:
( dividend + divisor - 1 ) / divisor
资料来源:《数字转换》,罗兰·巴恪思,2001年