2011-08-26 94 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