3

我正在尝试将 C# double 值转换为指数符号字符串。考虑这个 C# 代码:

double d1 = 0.12345678901200021;
Console.WriteLine(d1.ToString("0.0####################E0"));
//outputs: 1.23456789012E-1 (expected: 1.2345678901200021E-1)

如果可能的话,谁能告诉我从双 d1 输出“1.2345678901200021E-1”的格式字符串?

4

5 回答 5

3

双值仅包含 15 到 16 位数字,您有 17 位(如果我数对了)。因为 64 位双精度数仅包含 16 位数字,所以您的最后一位数字被截断,因此当您将数字转换为科学计数法时,最后一位数字似乎已被截断。

您应该改用十进制。十进制类型可以保存 128 位数据,而双精度类型只能保存 64 位。

于 2013-06-11T19:55:12.620 回答
2

根据文档double.ToString()double没有精度:

默认情况下,返回值仅包含 15 位精度,尽管内部维护最多 17 位。如果此实例的值大于 15 位,则 ToString 返回 PositiveInfinitySymbol 或 NegativeInfinitySymbol 而不是预期的数字。如果您需要更高的精度,请使用“G17”格式规范指定格式,它始终返回 17 位精度,或“R”,如果数字可以用该精度表示,则返回 15 位数字,如果数字只能表示,则返回 17 位数字以最高精度表示。

于 2013-06-11T19:56:59.640 回答
1

Console.WriteLine(d1)应该告诉你 double 不支持你想要的精度。改为使用decimal(64 位与 128 位)。

于 2013-06-11T19:53:29.273 回答
1

我的即时窗口说,您可以从该double 数字中获得的最大分辨率约为 15 位。

于 2013-06-11T19:55:19.090 回答
0

我的 VS2012 即时窗口说 0.12345678901200021 的分辨率实际上是 16 位有效数字:

0.1234567890120002

因此,我们希望在字符串中至少报告最后一个“2”数字。

但是,如果您使用“G17”格式字符串:

0.12345678901200021D.ToString("G17");

你会得到一个 16 位精度的字符串。看到这个答案

于 2013-06-11T21:22:20.177 回答