【问题标题】:C# double.ToString() max number of digits and trailing zerosC# double.ToString() 最大位数和尾随零
【发布时间】:2021-02-18 03:14:30
【问题描述】:

如何将double 转换为最大6 位数的string 并删除尾随零?

我想要:

2.123456123 -> "2.123456"
0.0000012 -> "0.000001"   (and not "1.2e-6")
12.45 -> "12.45"   (and not "12.450000")
36 -> "36"   (and not "36.000000")

使用string.Format("{0:F6"}, value) 输出尾随零和string.Format("{0:G6"}, value) 不适合第二个示例。

使用value.ToString("0.######)可以吗?

string.Format() 有没有等效的方法?

【问题讨论】:

  • 是的,可以使用value.ToString("0.######")。它将使用当前线程的当前区域性,例如在决定使用什么字符串(如.)作为小数点时。 string.Format 的等价物很简单:string.Format("My number {0:0.######} looks good.", value) 如果你想要文化独立,请分别尝试value.ToString("0.######", CultureInfo.InvariantCulture) string.Format(CultureInfo.InvariantCulture, "My number {0:0.######} looks good.", value)
  • # 就是为此专门制作的。
  • 感谢您的快速解答!

标签: c# string format


【解决方案1】:

可以使用value.ToString("0.######")。但是,您应该考虑另一件事:double 不是十进制(以 10 为底)数。您不应该依赖数字的十进制表示来合理 - 大量正常的以 10 为基数的十进制数需要以 2 为基数的无限十进制扩展。

如果您确实关心十进制表示,可能改用decimal 会更好 - 它也是一个浮点数,但以 10 为底。

无论哪种情况,这都涉及四舍五入 - 这可能是您想要的,也可能不是您想要的。

【讨论】:

  • 在这个double 的特殊情况下,当数量(其绝对值)超过十亿时,精度开始成为问题。例如,1000000000.654321 以这种方式格式化为字符串时将不具有完整精度(字符串变为"1000000000.65432")。
  • 感谢您的回答。确实是因为 double 的自然四舍五入在最后一位小数中不精确,所以我们需要在将值写入文件时对其进行四舍五入。我们注意到,根据所使用的机器,自然舍入不会相同(大约 1e-14 / 1e-15 精度)。
【解决方案2】:

tokens 是一个带有 Price 字符串属性的 ViewModel:

foreach (var item in tokens)
{
  item.Price = double.Parse(item.Price).ToString("#,0");
}

// 123456 => 123,456

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多