Double.ToString()什么时候以科学记数法返回一个值?

时间:2012-10-19 15:40:02

标签: c#

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

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

4 个答案:

答案 0 :(得分:5)

从文档中可以看出,用于表示数字的最紧凑形式将被选中。

即,当您未指定格式字符串时,default is the "G" format string。从specification of the G format string开始:

  

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

说明符default for the number of digits为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,实际上是{{1}}。默认情况下,显示15位有效数字。当有更多数字(并且除了某些特殊数字之外总是存在)时,这些数字以正常方式舍入。舍入后,将删除多余的零。

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

答案 1 :(得分:5)

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

  

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

来自General Numeric Format Specifier的文档:

  

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

     

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

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

虽然在表格的前面,但措辞略有不同:

  

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

我还没有弄清楚这两者是否总是等同于Double值......

编辑:根据Abel的评论:

  

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

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

答案 2 :(得分:4)

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

因为定点0.000011E-05更多的字符,所以它将支持科学记数法。我想如果它们的长度相等,则有利于定点。

答案 3 :(得分:1)

我刚试了一个循环:

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