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