我认为它与前导零或尾随零的数量有关,但我在 msdn 中找不到任何可以给我具体答案的东西。
什么时候Double.ToString(CultureInfo.InvariantCulture)
开始以科学计数法返回值?
我认为它与前导零或尾随零的数量有关,但我在 msdn 中找不到任何可以给我具体答案的东西。
什么时候Double.ToString(CultureInfo.InvariantCulture)
开始以科学计数法返回值?
从文档中可以看出,将选择表示数字的最紧凑的形式。
即,当您不指定格式字符串时,默认为“G”格式字符串。从G 格式字符串的规范如下:
结果:最紧凑的定点或科学记数法。
带有说明符的位数的默认值是 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
, not 0,20000000000000001
,实际上是。默认情况下,显示 15 位有效数字。当有更多数字时(并且总是有,除了某些特殊数字),这些数字以正常方式四舍五入。舍入后,去除多余的零。
请注意,double 的精度为 15 位或 16 位,具体取决于数字。因此,通过显示 15 位数字,您看到的是正确四舍五入的数字,并且始终是完整的表示,并且是 double 的最短表示。
从文档中Double.ToString(IFormatProvider)
:
此实例使用通用数字格式说明符 ("G") 进行格式化。
来自通用数字格式说明符的文档:
如果以科学记数法表示数字所产生的指数大于 -5 且小于精度说明符,则使用定点记数法;否则,使用科学计数法。如果需要,结果包含一个小数点,小数点后的尾随零被省略。如果存在精度说明符并且结果中的有效位数超过指定的精度,则通过舍入去除多余的尾随数字。
但是,如果数字是 Decimal 并且省略了精度说明符,则始终使用定点表示法并保留尾随零。
的默认精度说明符Double
记录为 15。
虽然在表的前面,但措辞略有不同:
结果:最紧凑的定点或科学记数法。
我还没有弄清楚这两者是否总是等价的Double
......
编辑:根据亚伯的评论:
此外,它并不总是最紧凑的符号。0.0001 大于 1E-04,但第一个是输出。MS 文档在这里并不完整。
当然,这符合更详细的描述。(因为所需的指数大于 -5 且小于 15。)
它使用格式化程序“G”(代表“General”),指定使用“最紧凑的定点或科学记数法” http://msdn.microsoft.com/en-us/library/dwhawy9k。 aspx
因此,由于定点的0.00001
字符数多于1E-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