Double.ToString()何时以科学计数法返回值?

我假设它与前导零或尾随零的数量有关,但我在msdn中找不到任何能给我一个具体答案的东西。

Double.ToString(CultureInfo.InvariantCulture)在什么时候开始以科学记数法返回值?

来自Double.ToString(IFormatProvider)的文档:

此实例使用通用数字格式说明符(“G”)格式化。

从通用数字格式说明符的文档:

如果以科学记数法表示数字而产生的指数大于-5且小于精度说明符,则使用定点表示法; 否则,使用科学记数法。 如果需要,结果包含小数点,并且省略小数点后的尾随零。 如果存在精度说明符且结果中的有效位数超过指定的精度,则通过舍入删除多余的尾随数字。

但是,如果数字是十进制并且省略精度说明符,则始终使用定点表示法并保留尾随零。

Double的默认精度说明符记录为15。

尽管在表格的前面,它的措辞略有不同:

结果:最紧凑的定点或科学记数法。

我还没有弄清楚这两个是否总是相当于Double值……

编辑:根据Abel的评论:

此外,它并不总是最紧凑的符号。 0.0001大于1E-04,但第一个是输出。 这里的MS文档不完整。

当然,这符合更详细的描述。 (因为所需的指数大于-5且小于15.)

从文档中可以看出,将选择代表数字的最紧凑的forms。

即,当您未指定格式字符串时, 默认为“G”格式字符串 。 从G格式字符串的规范如下:

结果:最紧凑的定点或科学记数法。

使用说明符时,数字的默认值为15。 这意味着可以表示为某个二进制表示的数字(如harriyott示例中的0.1)将显示为固定点,除非指数表示法更紧凑。

当有更多数字时,默认情况下,它将显示所有这些数字(最多15个),并在较短时选择指数表示法。

把它放在一起:

 ?(1.0/7.0).ToString() "0,142857142857143" // 15 digits ?(10000000000.0/7.0).ToString() "1428571428,57143" // 15 significant digits, E-notation not shorter ?(100000000000000000.0/7.0).ToString() "1,42857142857143E+16" // 15 sign. digits, above range for non-E-notation (15) ?(0.001/7.0).ToString() "0,000142857142857143" // non E-notation is shorter ?(0.0001/7.0).ToString() "1,42857142857143E-05" // E-notation shorter 

而且,有趣的是:

 ?(1.0/2.0).ToString() "0,5" // exact representation ?(1.0/5.0).ToString() "0,2" // rounded, zeroes removed ?(1.0/2.0).ToString("G20") "0,5" // exact representation ?(1.0/5.0).ToString("G20") "0,20000000000000001" // unrounded 

这是为了显示场景背后发生的事情以及为什么0.2被写为0.2 ,而不是0,20000000000000001 ,实际上是。 默认情况下,显示15位有效数字。 当有更多数字(并且总是存在,除了某些特殊数字)之外,这些都是正常方式。 舍入后,删除冗余零。

请注意,double的精度为15或16位,具体取决于数字。 因此,通过显示15位数字,您看到的是正确向下舍入的数字,并且始终是完整的表示,以及双精度的最短表示

它使用格式化程序“G”(用于“常规”),指定使用“最紧凑的定点或科学记法” http://msdn.microsoft.com/en-us/library/dwhawy9k。 ASPX

因此定点0.000011E-05更多的字符,它将有利于科学记数法。 我想如果它们长度相等,那么它有利于定点。

我刚试了一个循环:

 double a = 1; for (var i = 1; i < 10; i++) { a = a / 10; Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); } 

输出是:

 0.1 0.01 0.001 0.0001 1E-05 1E-06 1E-07 1E-08 1E-09