2013-02-26 111 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

相關問題