C#双重格式化

时间:2013-06-11 19:49:40

标签: c#

我正在尝试将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”的格式字符串,如果可能的话?

5 个答案:

答案 0 :(得分:3)

双值只能容纳15到16位数,你有17位(如果我算得正确的话)。由于64位双数字仅保留16位数字,因此您的最后一位数字会被截断,因此当您将数字转换为科学计数法时,最后一位数字似乎已被截断。

您应该使用Decimal。十进制类型可以保存128位数据,而double只能保存64位。

答案 1 :(得分:2)

根据the documentation for double.ToString()double没有精确度:

  

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我的直接窗口是说double可以获得的最大分辨率 数字是关于 15位数。

答案 4 :(得分:0)

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

0.1234567890120002

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

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

0.12345678901200021D.ToString("G17");

你将得到一个16位精度的字符串。 请参阅此answer