2012-04-09 95 views
1

我正在尋找一種方式來四捨五入到最接近的美元以下規定:
(如果wholenumber.50以上四捨五入到下一個整數)
(如果wholenumber.49和下面輪下跌到目前的整數)整到最近的美元

我曾嘗試:

Math.Round(wholenumber.xx, MidpointRounding.ToEven); 

這並不總是圓我多麼希望,例如1.5 = 2和2.5 = 2,因爲它四捨五入到最接近的偶數。

我也曾嘗試:

Math.Round(wholenumber.xx, MidpointRounding.AwayFromZero); 

這總是舍入到較大的整數。

是否有任何內置的功能爲我正在嘗試做什麼,或者我需要寫我自己的自定義方法來檢查號碼和做樓或ceil取決於?

+5

使用浮點算術存儲貨幣是不是一個好主意,但.. – Jack 2012-04-09 21:40:19

+0

你可以做數學沒有第二個參數,我想呢?這就是你所描述的默認舍入。 – MarioDS 2012-04-09 21:41:22

+3

MidpointRounding.AwayRoundZero就是你所描述的。這並不意味着要彙總所有值,只有中點(0.5)。 – dtb 2012-04-09 21:41:45

回答

11

首先,我注意到您應該始終使用decimal來完成此任務;從不使用double。如果您使用的是double,請立即停止正在執行的操作並修復程序,以便您停止使用專爲物理問題設計的類型問題,並開始使用專爲設計的類型問題來解決您的資金問題。

其次,你當你說

這總是舍入到較大的整數是完全錯誤的。

它沒有。它會四捨五入到最接近的整數,如果因爲處於中點而沒有最接近的整數,那麼它將選擇距離零較遠的整數

試試吧,如果你不相信我:

using System; 
class P 
{ 
    static void Main() 
    { 
    decimal buckFifty = 1.50m; 
    decimal buckFortyNine = 1.49m; 
    Console.WriteLine(Math.Round(buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(buckFifty, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFifty, MidpointRounding.AwayFromZero)); 
    } 
} 

結果

1 
2 
-1 
-2 
+0

我明白你的意思了。我在處於中點的時候正在考慮它。在中點時它總是走向更高的數字。我也正在使用Decimal。 – Baxter 2012-04-09 21:51:44

+1

@Baxter:*「在中點時,它總是走向更高的數字。」* - 根據你的問題,這正是你想要的...... – 2012-04-09 21:52:59

+0

謝謝,這使我變得直率。 – 2012-04-09 21:53:24