【问题标题】:How to change the precision (with trailing zero preservation) for a decimal in C# [duplicate]如何在 C# 中更改小数的精度(保留尾随零)[重复]
【发布时间】:2017-04-04 07:46:50
【问题描述】:

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

25.000m.ToString()

返回 "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

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

【问题讨论】:

  • Decimal 和 Double 都是浮点数,区别在于 Decimal 是 128 位浮点十进制数,而 Double 是 64 位浮点二进制数。如果你想要小数精度使用小数,如果你想要大的自然数使用双精度。
  • 在我看来,您应该在将其转换为字符串时选择精度,而不是乱用Math.Round()
  • @MatthewWatson 小数具有固有的精度。想要使用它而不是忽略它是合理的。
  • @Rawling 我知道,但它的用途值得怀疑。您可能希望以不同的小数位数显示相同的数字。

标签: c# decimal rounding decimal-point


【解决方案1】:

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

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

打印 z 显示它现在有 3 个小数位。我同意 cmets 的观点,但这是值得怀疑的。

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


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

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

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

【讨论】:

  • 谢谢,但是...嗯,这行得通:((decimal) 25d) + 0.000m,但为什么不是((decimal) Math.Round(25d, 3)) + 0.000m?我也不明白你关于“积分部分”的说明。要接受此答案,请将其更改为使用 double 作为来源。
  • @maf-soft 小数保留尾随零。双打不行。没有精度变化。为什么你关心尾随零的数量?顺便说一句,((decimal) Math.Round(25d, 3)) + 0.000m 在 LinqPad 上返回 25.000。两个 sn-ps 都返回一个带有 3 个尾随零的小数
  • @maf-soft - Decimal.MaxValue,例如,小数点后没有数字。由于decimal 类型中可用的精度 不足,无法将其更改为小数点后3 位。 MaxValue(或MinValue)的 3 个数量级内的任何其他值都不能更改为 3 d.p.
  • @maf-soft 您是否将这些值与 Parameters.AddWIthValue 一起使用?这是尾随零可能很重要的唯一情况,只是因为 ADO.NET 必须猜测数字参数使用什么精度和小数位数
  • @PanagiotisKanavos,我在 Visual Studio 2008 QuickWatch 中输入了( ((decimal) Math.Round(25d, 3)) + 0.000m ).ToString(),它返回“25”。然后我在 VS 2015 C# 交互式窗口中做了同样的事情,它返回“25.000”。令人着迷!
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2012-12-21
  • 2020-03-10
  • 1970-01-01
  • 2015-11-19
  • 2021-12-02
  • 2014-08-28
  • 2014-09-13
相关资源
最近更新 更多