Double.toString(d)的最大长度是多少?

时间:2014-01-15 19:33:28

标签: java

我的实验表明,-Double.MIN_NORMAL达到了24的界限,结果为

-2.2250738585072014E-308

...但我无法证明这一点,也没有提出一个结论性的理由,为什么没有其他价值应该超过-MIN_NORMAL

3 个答案:

答案 0 :(得分:5)

这是一个64位的IEEE-754浮动。

可以存储在52位尾数中的大多数十进制数是17(参见page 4ceil( 1 + N Log10(2) )),因此带有小数点和负号的19个字符。

偏差是1023,所以最小的基数2指数是2 ^ -1022,大约是10 ^ -308,所以最长的指数是5个字符,带有'E'和负号。

19 + 5 == 24

答案 1 :(得分:1)

26似乎是一个上限,肯定如下。

根据GrepCode的FloatingDecimal.getChars版本,OpenJDK7 asserts,值nDigits最多为19个。查看代码,nDigits似乎引用到尾数的数字(不是小数点):在上面的例子中,22250738585072014。其他字符包括

  • 整个价值的-标志
  • .小数点
  • 指数的E
  • 指数上的-符号
  • 指数最多三位小数

......这使得19 + 7 = 26。

(对于更严格的界限的争论仍然受到欢迎。)

答案 2 :(得分:0)

我认为这个界限是正确的。 javadoc

  

ma的小数部分必须打印多少位数?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只需要多少个,更多的数字来唯一地区分参数值和double类型的相邻值。

double具有隐含的整数部分(1)和52个尾数位。因此,如果double表示的base-2指数为0,那么x是范围[1,2]中的double,那么下一个更高的邻居{{1是} double + 2 -52 。 2 -52 约为2.2204 * 10 -16 。这表明将值与下一个相邻值区分开所需的小数位数是16,即与1相邻的双数将表示为x(15个零)。由于这与实验中的小数位数相匹配,因此它很可能确实是所需的最大数。当然,这不是一个严格的证明;这将需要更多的工作。