十进制舍入到2精度,使X转换为X.00 C#

Ans*_*gam -2 .net c#

首先,这不是一个重复的问题,我需要总是有2个精度小数

例如
2应转换为2.00
0应转换为0.00
0.5应转换为0.50

输出数必须是小数

我尝试过的事情

decimal val = 0.5000M
decimal d = Math.Round(val, 2);//gives 0.5 i need 0.50
Run Code Online (Sandbox Code Playgroud)

注意:我不打算将十进制转换为字符串,因为我需要将其作为仅接受十进制值的soap请求发送,因此我没有灵活性将其转换为字符串.

由Jakub Lortz回答的以下代码更新工作正常虽然看起来很复杂

Jakub Lortz的解决方案1

decimal twoPoint00 = new Decimal(200, 0, 0, false, 2); decimal twoPoint0 = new Decimal(20, 0, 0, false, 1); Console.WriteLine(twoPoint00) // prints 2.00 Console.WriteLine(twoPoint0) // prints 2.0

博格丹的解决方案2

他给出了非常简单的解决方案,这也将起作用
decimal val = 0.5000M;
string result = string.Format("{0:f2}", val); decimal d; Decimal.TryParse(result, out d);

Jak*_*rtz 5

有一个构造函数Decimal允许您指定比例:

public Decimal(
    int lo,
    int mid,
    int hi,
    bool isNegative,
    byte scale
)
Run Code Online (Sandbox Code Playgroud)

例如:

decimal twoPoint00 = new Decimal(200, 0, 0, false, 2);
decimal twoPoint0 = new Decimal(20, 0, 0, false, 1);
Console.WriteLine(twoPoint00) // prints 2.00
Console.WriteLine(twoPoint0)  // prints 2.0
Run Code Online (Sandbox Code Playgroud)

C#编译器使用此构造函数从文字创建小数,因此您可以在编译的IL中轻松检查它.

编辑

要将十进制值转换为具有设置精度的表示,首先必须使用Decimal.GetBits方法来获取其内部表示.然后修改值(可能使用BigInteger整个96位值作为一个整体?)并创建一个新的小数.

看起来像很多工作,有很多可能的错误.我首先检查Bogdan的答案中提出的解决方案- ToString()+ Parse().它似乎工作正常,非常简单.