如何更改 C# 中小数的精度(保留尾随零)

How to change the precision (with trailing zero preservation) for a decimal in C#

C# 中的一个 decimal 值有一个固定的小数点,因此知道它在创建时有多少个小数位:

25.000m.ToString()

returns "25.000",与具有浮点数的 double 不同。

这个问题不是关于如何显示固定小数位数的问题,我知道各种字符串转换选项。这是关于 decimal 数据类型的内部表示,我只是用 .ToString() 来展示它。

现在我想将一个数字四舍五入到固定的小数位数。这有效:

Math.Round(25.0000m, 3) -> 25.000

但是当小数位数小于3,或者它来自一个double,它不会(当然):

Math.Round(25.00m, 3) -> 25.00
Math.Round((decimal) 25.0000d, 3) -> 25
(decimal) Math.Round(25.0000d, 3) -> 25

那么如何将任何 double 数字四舍五入为具有 3 个强制位置的 decimal

由于难以解释,欢迎提出更好的标题建议!

您可以随时将 0.000m 添加到结果中:

        var x = Math.Round(25.00m, 3);
        var y = 0.000m;
        var z = x + y;

打印 z 显示它现在有 3 位小数。我同意评论,但这是有问题的价值。

(注意 - 如果 x 的当前值足够大以至于在不更改整数部分的情况下无法容纳额外的位置,这仍然不会创建 3 个小数位)


提问者编辑:为了使这个答案可以接受,从评论中添加这个(这个问题要求双重来源,这也解决了 VS2008 的问题):

var z = Math.Round(((decimal) 25d) + 0.000m, 3);

有趣的是,在 VS2008 中,它仅在转换为 decimal 并在 Math.Round() 中添加 0.000m 时有效。在VS2015中也可以在外面完成。如果有人知道对此的解释,请发表评论。