2013-02-26 145 views
4

我分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 

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

+2

问:你在乎负值?例如,在'-9d/4d'上使用'Math.Ceiling'会给你'-2'而不是'-3'。 – 2013-02-26 22:44:00

回答

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

leora没有指定,但是这可能会对负数整数产生不正确的结果:'将(-9,4)除以'-1'(我认为这是错误的)(另外,我想你可能混淆了'分母和分子) – 2013-02-26 22:49:30

+0

它似乎工作。但我相信,'分母'和'分子'的名字应该交换。 – 2013-02-26 22:50:50

+0

固定。感谢你们俩的指示。我非常善于犯这个错误。在我的母语中,分母这个词听起来像“数字”。 – 2013-02-26 22:58:36

0

其中一个整数的应该是double

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

+1使用'MidpointRounding'枚举。 – 2013-02-26 22:39:36

+4

但这些不会得到所需的结果。莱奥拉希望限制价值。 9/4 = 2.25,取整取结果2.“MidpointRounding”仅影响中间值,如“1.5”。 – 2013-02-26 22:39:37

+0

你说得对。我已经看到这太迟了。已经由Alexei回复了。 – 2013-02-26 22:45:06

4

您需要执行部门为浮点/双精度和使用Math.Ceiling

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

样品:

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

这绝对不是你正在寻找...

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

不需要Math类的任何铸造或使用该方法。

+0

杰弗里萨克斯的方法达到同样的效果,对我来说更自然。 – ErikE 2013-02-26 23:00:22

+0

是的,但他的方法使用内部铸造,并且需要检查以确保分子不为零。我真的在这里分开毛发... – 2013-02-26 23:11:27

+0

为什么你必须检查分子是否为零?例如,如果分区为“0/5”,则通过“(0 + 4)/ 5”得到0。什么内部铸造?你正在使用'int'只是... – ErikE 2013-02-27 01:04:21

相关问题