C# 将十进制设置为2位。问题

C# 将十进制设置为2位。问题,c#,C#,我在格式化金额时使用了下面的小数位,但在使用eg 25000进行测试时,我没有得到正确的金额,我预计是25000.00 但我得到了25000英镑 我做错了什么?我应该如何改变它 [TestCase(123.45453, 123.45, 2)] [TestCase(125.55453, 125.55, 2)] [TestCase(125.55653, 125.56, 2)]

我在格式化金额时使用了下面的小数位,但在使用eg 25000进行测试时,我没有得到正确的金额,我预计是25000.00 但我得到了25000英镑

我做错了什么?我应该如何改变它

                [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);
                }
编辑:


如果您要格式化一个十进制值,无论该值是多少,即使是25000,您想要25000.00或1234.224543返回1234.22,您将如何编码它

您没有比较格式化的值。
decimal
本身没有格式;当您将图片表示为字符串时,格式就会出现在图片中。

在我看来,您传递的是双精度值,而不是小数。试试这个:

[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
是否保留尾随数字,当然。。。我想是的,但我一时记不清了


其他人指出了“当你转换成一个字符串时,在显示点上只有一个圆”的可能性——我不能说这是否适合你的情况。我知道25000米和25000.00米之间的代表性存在差异。当然,您是否应该四舍五入到给定的小数位数将取决于您的业务需求。

这是因为25000等于25000.00,所以它正在调整零

我认为问题在于对这里的decimal places参数的误解——它不是说应该显示多少个小数位,而是用于四舍五入和可能的最大小数位数

弗雷德里克是对的

如果要将其表示为字符串,可以使用ToString(字符串格式)方法,如:

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

或其他格式化程序(请参见)

,但
25000m
25000.00m
的位表示形式存在差异(不同于双精度)。在某些意义上是相等的,但并非全部。这两个值具有不同的内部表示形式。。。调用
25000m.ToString()
将不会得到与
25000.00m.ToString()
相同的结果。感谢您的回复。需要四舍五入并返回2位小数,而不考虑数量。您会怎么做?有时我需要转换为字符串,有时它已经是小数,但需要格式化为只有2位小数和四舍五入。我认为问题不在于四舍五入,而在于之后的比较。如果您有2500,并将其四舍五入到两位小数,它将保持不变:在本例中,我建议将两者都转换(输入值和期望值)然后对格式化的字符串进行比较。谢谢你的回复。将单元测试放在一边一秒钟。我所要做的只是创建一个函数,将我的十进制数格式化为只有2个十进制数,并对其进行四舍五入,有时返回给定十进制数的字符串,有时返回给定十进制数的十进制数。并且似乎不适用于圆形数字如25000。我应该用不同的代码编写函数,还是有两个重载。一个返回字符串,另一个返回小数?现在对格式感到困惑。多谢了suggestions@user231465:这里的关键词是格式。这意味着结果应该是字符串,而不是小数。你不能有只因返回类型不同的重载,但是如果你有一个方法在返回字符串的名称中包含单词
Format
,你可以有另一个不同的名称(如果你真的认为合适的话)它返回一个
十进制
…谢谢你的回复。只是为了确保我理解你的建议。转换为字符串并设置相应的格式,然后在适当的时候将其转换为十进制。这就是您所说的吗?@user231465:您可能应该尽可能长时间地将其保留为十进制,而不进行四舍五入,并且只在最后一刻设置格式。几乎可以肯定的是,您不应该解析自己格式设置的结果。