2011-08-26 57 views
2

我使用下面放個小數位格式的量,但是當我沒有得到正確的量與如25000測試我期待25000.00 但我得到25000格式化小數2 places.Problem

我做錯了什麼?我應該如何改變它?

   [TestCase(123.45453, 123.45, 2)] 
       [TestCase(125.55453, 125.55, 2)] 
       [TestCase(125.55653, 125.56, 2)] 
       [TestCase(125.56554, 125.57, 2)] 
       [TestCase(25000,25000.00,2)] 

    public void MyRoundFunction_returns_amount_with_decimal_places(decimal amountToTest, decimal expected, int decimalPlaces) 
       { 
        decimal actual = MyRoundFunction(amountToTest, MidpointRounding.ToEven, decimalPlaces); 
        Assert.AreEqual(expected, actual); 
       } 


     public static decimal MyRoundFunction(decimal value, MidpointRounding midpointRounding, int decimalPlaces) 
       { 
        return Math.Round(value, decimalPlaces, midpointRounding); 
       } 

編輯:

如果你是格式化十進制值不論金額多少總是有2位小數,即使是像25000,你想25000.00或1234.224543收益1234.22如何將你的代碼呢?

回答

6

它在我看來像你傳遞雙值而不是小數。試試這個:

[TestCase(123.45453m, 123.45m, 2)] 
[TestCase(125.55453m, 125.55m, 2)] 
[TestCase(125.55653m, 125.56m, 2)] 
[TestCase(125.56554m, 125.57m, 2)] 
[TestCase(25000m, 25000.00m,2)] 

這是可能的,不會連建設 - 我也不會感到驚訝,如果decimal值在屬性不允許作爲CLR不知道他們。如果確實發生了,那麼您可能希望將輸入更改爲字符串,在測試開始時將它們解析爲小數,然後對它們進行比較。您需要檢查decimal.Parse是否保留了最後的數字,當然...我認爲它確實存在,但我不記得確實如此。

其他人指出「只有在顯示點上,當你轉換爲字符串」的可能性 - 我不能說這是否適合你的情況。我知道有 25000m和25000.00m之間的表示差異。當然,您是否需要四捨五入到給定的小數位數取決於您的業務需求。

+0

感謝您的答覆。將單元測試留在一邊秒。所有我試圖做的是創建一個函數/ s,將格式化我的小數只有2小數,它有時返回一個給定小數的字符串,有時返回一個十進制給出了一個小數.And似乎不適用於一個圓形數字,例如25000。我應該不同地編寫我的函數還是有2個overloads.one返回一個字符串,而另一個返回一個小數?現在變得與格式混淆。感謝您提供更多建議 – user9969

+0

@ user231465:這裏的關鍵詞是* format *。這表明結果應該是一個字符串,絕對不是**小數。你不能只有返回類型有不同的重載 - 但如果你有一個方法,包括返回一個字符串的名稱中的'格式'一詞,你可以有另一個不同的名稱(如果你真的認爲它是合適的),它返回一個「十進制」... –

+0

感謝您的答覆。只是爲了確保我明白你的建議。轉換爲字符串並相應地格式化,然後在appriopriateate時將其轉換爲小數。這就是你所說的? – user9969

2

您沒有比較格式化的值。 A decimal本身沒有格式;當你將它表示爲一個字符串時,格式化會進入畫面。

+1

但有*是*的差異在「25000m」和「25000.00m」的位表示中(與雙打不同)。 –

0

這是因爲25000等於25000.00,因此它正在修整零。

我認爲這個問題是誤解小數位參數在這裏 - 這不是說應該顯示多少小數位,而是用於四捨五入和最大可能的小數位數。

+0

它在某些意義上是平等的,但並非全部。這兩個值有不同的內部表示形式......並且調用'25000m.ToString()'不會產生與'25000.00m.ToString()'相同的結果。 –

0

@Fredrik是對的。

如果你想將其表示爲字符串,可以使用的ToString(字符串格式)的方法,如:

decimal number = 1200; 
string formatted = number.ToString("#.###,00"); 

或其他格式化程序(見http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

+0

感謝您的回覆。需要舍入並返回2位小數,無論數量多少。您如何做?有時我需要轉換爲字符串,有時它已經是小數,但需要格式化爲只有2位小數並舍入 – user9969

+0

我認爲問題不在於你的四捨五入,其後跟比較。如果你有2500和四捨五入到兩位小數,它將保持不變:我建議在這種情況下,將(輸入和期望值)轉換爲格式化的字符串,然後比較字符串。 – MADMap