2010-10-31 79 views
3

考慮下面的C#代碼舍入的數:使用非標準規則

Decimal number = new decimal(8.0549); 
Decimal rounded = Math.Round(number, 2); 
Console.WriteLine("rounded value: {0}", rounded); 

時會產生輸出:8.05

Math.Round的algoritm只檢查下一個數字超出作爲參數的小數數。
我需要一個檢查所有小數鏈的算法。在這種情況下,9應該輪4〜5這反過來將輪5至6,產生最終結果8.06

更多exemples:
8.0545 - > 8.06
8.0544 - > 8.05

有一些內置在該方法可以幫助我嗎?
謝謝。

+4

我屁股你知道你提出的舍入在數學上是不正確的嗎?即8.0545比8.06接近8.05,所以四捨五入到8.06是不正確的四捨五入。 – 2010-10-31 16:38:20

+2

只是好奇(因爲你正在尋找的不是四捨五入的)......爲什麼? ;) – 2010-10-31 16:39:18

+1

是的,我知道這不是數學上正確的。那是因爲我稱它爲「非標準」。但它仍然是一個四捨五入的,不是? :)我也不同意這個規則。但是上級命令.. – 2010-10-31 16:45:35

回答

1

否;你需要自己寫。

1

我希望,如果有一個內置的方法來做到這一點,就已經被報道爲錯誤;)

話雖這麼說 - 你可以創建一個需要你的小數,隨着方法最大和最小號的地方,從一輪反轉,並在循環粉碎下來的希望的地方 - 即是這樣的:

private static double NotQuiteRounding(double numToRound, int maxPlaces, int minPlaces) 
{ 
    int i = maxPlaces; 
    do 
    { 
     numToRound = Math.Round(numToRound,i); 
     i = i - 1; 
    } 
    while (i >= minPlaces); 

    return numToRound; 
} 

,並調用它是這樣的:

Console.WriteLine(NotQuiteRounding(8.0545,10,2)); 
    Console.WriteLine(NotQuiteRounding(8.0544,10,2)); 
+2

只要不這樣做,否則在例行的結束時,事情將被釋放,孩子將被吃掉。 – 2010-10-31 16:48:54

+2

..確實......但在萬聖節上想出這個是非常合適的,但:-) – 2010-10-31 16:51:12

+1

不應該''我減少而不是增加? – 2010-10-31 17:00:22