如何格式化尽可能多的有效数字的双精度数?

时间:2011-09-17 21:54:34

标签: .net formatting floating-point tostring number-formatting

我希望使用 来格式化双值以保持相同的值。 我想要使用指数表示法,因为字符串的接收者需要浮点表示法。

示例:

12.0 -> "12"
12.20300 -> "12.203"

修改 Round-trip specifier "R"似乎做了我需要的事情。至少在我测试的数量下,它按预期工作。

3 个答案:

答案 0 :(得分:0)

您可以将String.Format与自定义格式字符串结合使用,告诉格式化程序按照您希望的方式打印它。在这种情况下,您希望使用0.################行的修饰符。该格式化器实质上指定该数字应该在小数点之前至少有一个数字,并且在它之后最多(但不一定)十六个数字。不幸的是,你必须有一个最大值,用#个符号表示,但16个应该绰绰有余。

String.Format("{0:0.################}", 12.20300);

答案 1 :(得分:0)

格式(x,“0。################”)非常接近,但在有效数字{{1}之后有一些非零垃圾对于大多数分数。

你可以通过这种方式在小数点右边获得更多的数字,但它并不实用(因为它们是垃圾数字),可能不是你想要的:

cDbl(Format(x, "0.################")) <> x

即使这样,你可能也无法从double转换为string并返回double,并使它们相等。我知道这样做的唯一方法是科学记数法或十六进制。

答案 2 :(得分:0)

它无法真正完成。不管怎样,并非使用Doubles。双打只是没有 足够的数字,你可以显示任何数字,这可能是为什么科学记数法用来显示你只需要调用时的值.ToString()

我们得到的双打输出是科学记数法,因为它更能代表价值。以此代码为例....

    double testValue = 9123456789012345678.234;
    string formatStr = "{0:0.####################################################},{1}";
    Debug.WriteLine(String.Format(formatStr, testValue, testValue));

我们获得的输出是:

  

9123456789012350000,9.12345678901235E + 18

我们开始使用的实际数字也不是。如果你忽略了非常大的数字,我想你会发现你发布的例子不要求你做任何事情。

 Debug.WriteLine(12.0d + " == " + String.Format("{0} == {1:0.########################}",  12.0d, 12.0d));
 Debug.WriteLine(12.20300d + " == " + String.Format("{0} == {1:0.########################}", 12.20300d, 12.20300d));
 Debug.WriteLine(-00.2900d + " == " + String.Format("{0} == {1:0.########################}", -00.2900d, -00.2900d));
 Debug.WriteLine(99999999999999999999999d + " == " + String.Format("{0} == {1:0.########################}", 99999999999999999999999d, 99999999999999999999999d));


12 == 12 == 12
12.203 == 12.203 == 12.203
-0.29 == -0.29 == -0.29
1E+23 == 1E+23 == 100000000000000000000000

在前三个示例中,无论是直接使用WriteLine显示它,还是使用没有格式字符串的String.Format,或使用“0。########”,输出就是您想要的。值不同的唯一情况是第四种情况,其中默认行为是显示科学记数法。改变这种行为会给你带有额外零的数字,你期望有意义的数字;但它可以在Samir用格式字符串显示时完成。