如何根据需要使用尽可能多的有效数字格式化双精度数



我想用尽可能多的数字来格式化一个双精度值 以保持相同的值。我不想使用指数表示法,因为字符串的接收者需要浮点表示法。

例子:

12.0 -> "12"
12.20300 -> "12.203"
编辑:

往返指示符"R"似乎满足了我的需要。至少对于我测试的数字,它的工作效果与预期一致。

您可以使用String。使用自定义格式化字符串进行格式化,以告诉格式化程序按照您想要的方式打印它。在本例中,您希望使用类似0.################的修饰符。这个格式化程序本质上指定数字在小数点前至少有一位,小数点后最多有16位(但不一定)。不幸的是,您必须有一个最大值,用#符号的数量表示,但16应该绰绰有余。

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

格式(x, "0.################")非常接近,但是在有效数字之后有一些非零垃圾,使得大多数分数的cDbl(Format(x, "0.################")) <> x

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

For i = 1 To ndigits
  s = s & Math.Floor(x * (10 ^ i)) Mod 10
Next i

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

这是不可能的。无论如何,不要使用Doubles。双精度类型的没有足够的数字来显示任何数字,这可能就是为什么在调用。tostring ()

时使用科学记数法来显示值的原因。

对于double,我们得到的输出是科学记数法,因为科学记数法更好地表示值。以以下代码为例....

    double testValue = 9123456789012345678.234;
    string formatStr = "{0:0.####################################################},{1}";
    Debug.WriteLine(String.Format(formatStr, testValue, testValue));
我们得到的输出是:

9123456789012350000, 9.12345678901235 e + 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。不使用格式字符串进行格式化,或者使用"0"。########",输出就是您想要的。值唯一不同的情况是在第四种情况下,默认行为是显示科学符号。改变这种行为会给你带来额外的零,而你期望的是有意义的数字;但是它可以像Samir用格式字符串所展示的那样完成。

[往返说明符"R"][1]似乎做了我所需要的。至少对于我测试的数字,它的工作效果与预期一致。

最新更新