C# Double.ToString()何时返回科学记数法中的值?

C# Double.ToString()何时返回科学记数法中的值?,c#,C#,我假设它与前导或尾随零的数量有关,但我在msdn中找不到任何具体的答案 Double.ToString(CultureInfo.InvariantCulture)在什么时候开始以科学记数法返回值?我刚刚用一个循环尝试了这个方法: double a = 1; for (var i = 1; i < 10; i++) { a = a / 10; Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); } 从文件

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


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

我刚刚用一个循环尝试了这个方法:

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

从文件中可以看出,将选择最紧凑的形式来表示数字

即,当您未指定格式字符串时。从以下方面:

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

带说明符的值为15。这意味着可以精确表示为某个二进制表示形式的数字(如哈里约特示例中的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
,而不是
0200000000000000001
,实际上是这样。默认情况下,显示15位有效数字。当有更多的数字时(并且总是有,除了某些特殊的数字),这些数字按正常方式四舍五入。四舍五入后,删除多余的零

请注意,根据数字的不同,double的精度为15或16位。因此,通过显示15位数字,您看到的是一个正确的向下舍入数字,始终是一个完整的表示形式,并且双精度的最短表示形式

使用格式化程序“G”(表示“常规”),它指定使用“最紧凑的定点或科学表示法”

因此,由于定点
0.00001
1E-05
多个字符,因此将有利于科学记数法。我想,如果它们的长度相等,则有利于定点。

从文档中可以看出:

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

从以下文件:

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

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

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

虽然在表中的前面,它的措辞略有不同:

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

我还没有计算出这两个值对于
Double
值是否总是相等的

编辑:根据Abel的评论:

而且,它并不总是最紧凑的表示法。0.0001大于1E-04,但第一个为输出。MS文档在此不完整


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

我尝试了类似的实验,但仍然没有一个精确的答案来解释为什么会发生转换。您的答案不包括精度说明符是什么,这也是为什么会以这种方式显示的一部分。默认值为
15
。而且,它并不总是最紧凑的表示法
0.0001
大于
1E-04
,但第一个是输出。这里的MS文档不完整。我不同意“最紧凑”一词,并认为MSDN文档在这方面具有误导性。如果您使用双x=13950,那么G4格式将生成“1.395E+04”,这距离“最紧凑”还有几英里之遥。在我看来,“G”格式在C、Fortran等语言中工作得更好,因为它确实产生了“最紧凑”的字符串。C#强制我寻找解决方法…
0.0001
1E-04
有更多字符,但首选…)
?(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