将分割舍入为整数的正确方法是什么?

时间:2013-02-26 22:31:15

标签: c# math

我正在划分2个整数,并希望得到一个整数作为结果。我想要正确的Math.Round()方法,所以当我除以时,无论如何,它总是舍入到下一个整数。以下是一些预期如下的例子。

int result = (6/4); // = 2
int result = (3/4);  // = 1
int result = (1/4);  // = 1
int result = (8/4);  // = 2
int result = (9/4);  // = 3

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:6)

由于您示例中的所有整数都是正数,因此我假设您对一个或两个操作数为负或零的情况不感兴趣。

Math.Round适用于浮点数。这不是必要的。

除以两个整数会得到整数结果。它总是向下舍入。你想要这样的东西:

int Divide(int numerator, int denominator) {
    return (numerator + denominator - 1) / denominator;
}

例如,对于1/4,我们得到(1 + 4 - 1) / 4 = 4 / 4 = 1,对于8/4,我们得到(8 + 4 - 1) / 4 = 11 / 4 = 2

这里溢出的可能性很小,所以如果分子总是大于零,最好使用:

int Divide(int numerator, int denominator) {
    return 1 + (numerator - 1) / denominator;
}

答案 1 :(得分:4)

你需要将split除以float / double并使用Math.Ceiling

  

Math.Ceiling ...返回大于或等于指定的双精度浮点数的最小整数值。

样品:

 int result = (int)Math.Ceiling(6/4.0);
 result = (int)Math.Ceiling((double)3/4);

答案 2 :(得分:0)

其中一个整数应该是double

double result = (6d/4); // 1.5  
int rounded = (int)Math.Round(result, MidpointRounding.AwayFromZero);

答案 3 :(得分:0)

这绝对不是你要找的方法......

int mod = 9 % 4;
int result = (9 - mod) / 4) + (mod > 0 ? 1 : 0);

不需要任何转换或使用Math类。