【问题标题】:How to best approach rounding up decimals in C#如何最好地在 C# 中舍入小数
【发布时间】:2010-01-18 12:48:02
【问题描述】:

我的十进制值是 18.8。存储在此变量中的值可以是任何类型。例如,它可以是 1.0000000 或 1.00004000 或 5.00000008。 我想编写一个方法,以便我可以将小数传递给它并获得四舍五入的字符串。如果我知道我想得到的小数位,这将不是问题。但我想得到的是:

当它是 1.0000000 时,它应该返回 1。
如果它是 1.00004000,它应该返回 1.00004。
当它是 5.00000008 时,它应该返回 5.00000008。 所以基本上它应该找到最后一个数字后面的所有 0 与 0 不同并将其切断。

我应该如何处理它?最好的方法是什么?我从 SQL 中获取此值并将其放入十进制变量中,但随后我想显示它并在它可以显示为 5 时使用 5.0000000 对我来说有点矫枉过正。

希望我能得到一些好的建议。

【问题讨论】:

    标签: c# decimal rounding


    【解决方案1】:

    AFAIK,ToString("0.##") 可以,只需增加 # 的数量,这样您的值就不会四舍五入。例如:

    decimal d = 1.999m;
    string dStr = d.ToString("0.###");
    

    这将生成“1,999”字符串(分隔符取决于使用的文化)。

    因此,您可以使用常见的很长的格式化字符串:"0.############################" - 格式化所有值。

    【讨论】:

    • 我不知道我需要的小数位数。如果我知道我想在 3 位数或更多位数后将其切断,这将起作用。但我只想在最后一个非零之后所有数字都为零时才将其切断。
    • 如果你有 1.00004000,那么在 ToString("0.####################") 之后你将有 "1.00004"。说到# 符号的MAX:它是28。十进制允许最大28-29 位有效数字。这使得前导零为 1,其他符号为 28。即使你有 15555.98900008900 这样的东西也没关系。
    • 谢谢,它有效。我应该在怀疑它是否会像你说的那样工作之前对其进行测试。
    【解决方案2】:

    所以从最后修剪零。

    decimal d = 1.999m;
    string dStr = d.ToString().TrimEnd('0').TrimEnd('.');
    

    【讨论】:

    • 如果有值 1,000,000.00?然后他失去了所有的零,我想?或者还剩下“1,000,000”。
    • 他只丢失了点 (.) 之后的零,点仍然存在,但他可以添加另一个 TrimEnd('.')。对于 I18N,他不应该使用点,而应该使用特定于文化的分隔符。
    【解决方案3】:

    您还可以使用 string.Formathere's 不同可能格式的文档,但我更喜欢 Johan Sheehans cheat sheet 作为快速参考。

    decimal number=4711.00004711m;
    4711.00004711
    string.Format("{0:0.#############}",number);
    "4711,00004711"
    number=42;
    42
    string.Format("{0:0.#############}",number);
    "42"
    

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 一篇讨论binary浮点的文章与问题所问的decimal类型有何关系?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多