我假设它与前导零或尾随零的数量有关,但我在msdn中找不到任何能给我一个具体答案的东西.
在什么时候Double.ToString(CultureInfo.InvariantCulture)开始以科学记数法返回值?
从文档中可以看出,将选择代表数字的最紧凑的形式.
即,当您未指定格式字符串时,默认为"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
Run Code Online (Sandbox Code Playgroud)
而且,有趣的是:
?(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
Run Code Online (Sandbox Code Playgroud)
这是为了说明场景背后发生了什么,为什么0.2写成0.2,而不是0,20000000000000001实际上是.默认情况下,显示15位有效数字.当有更多数字(并且除了某些特殊数字之外总是存在)时,这些数字以正常方式舍入.舍入后,删除冗余零.
请注意,double的精度为15或16位,具体取决于数字.因此,通过显示15位数,您看到的是正确的向下舍入数字,并且始终是完整的表示,以及双精度的最短表示.
来自以下文档Double.ToString(IFormatProvider):
此实例使用通用数字格式说明符("G")格式化.
从通用数字格式说明符的文档:
如果用科学记数法表示数字所得的指数大于-5且小于精度说明符,则使用定点表示法; 否则,使用科学记数法.如果需要,结果包含小数点,并且省略小数点后的尾随零.如果存在精度说明符且结果中的有效位数超过指定的精度,则通过舍入删除多余的尾随数字.
但是,如果数字是十进制并且省略精度说明符,则始终使用定点表示法并保留尾随零.
默认精度说明符Double记录为15.
尽管在表格的前面,它的措辞略有不同:
结果:最紧凑的定点或科学记数法.
我还没弄清楚这两个是否总是相当于一个Double价值......
编辑:根据亚伯的评论:
此外,它并不总是最紧凑的符号.0.0001大于1E-04,但第一个是输出.这里的MS文档不完整.
当然,这符合更详细的描述.(因为所需的指数大于-5且小于15.)
| 归档时间: |
|
| 查看次数: |
6096 次 |
| 最近记录: |