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

Java Double.toString(d)的最大长度是多少?,java,Java,我的实验表明24是一个界限,这是由-Double.MIN_NORMAL达到的,这会导致 -2.2250738585072014E-308 …但我无法证明这一点,也无法给出任何其他值都不应超过-MIN\u NORMAL的结论性原因。我认为这个界限是正确的。警察说 m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值 双精度包含一个隐含的整数部分(1)和52个尾数位。因此,如果由doub

我的实验表明24是一个界限,这是由
-Double.MIN_NORMAL
达到的,这会导致

-2.2250738585072014E-308

…但我无法证明这一点,也无法给出任何其他值都不应超过
-MIN\u NORMAL

的结论性原因。我认为这个界限是正确的。警察说

m
a
的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值


双精度包含一个隐含的整数部分(1)和52个尾数位。因此,如果由
double
表示的基2指数为0,则
x
是范围内的
double
[1,2),则下一个较高的相邻
double
x
+2-52。2-52约为2.2204*10-16。这表明区分一个值与下一个相邻值所需的小数位数为16,即,与1相邻的两位数将表示为
1.0000000000000002
(15个零).因为这与你实验中的小数位数相匹配,所以很可能这确实是所需的最大位数。当然,这不是一个严格的证明;这需要更多的工作。

26似乎是一个上限,如下所示

根据GrepCode版本的
FloatingDecimal.getChars
,OpenJDK7显示值
nDigits
最多为19。查看代码,
nDigits
似乎是指尾数的数字(而不是小数点):在上面的示例中,
2250738585072014
。然后,其他字符包括

  • 一个
    -
    在值上作为一个整体签名
  • 小数点
  • 指数的
    E
  • 指数上有一个
    -
    符号
  • 指数上最多有三位十进制数字
…这使得19+7=26


(仍然欢迎更严格界限的论点。)

这是一个64位IEEE-754浮点

52位尾数中最多可以存储的十进制数是17(请参阅:
ceil(1+nlog10(2))
),这是19个带小数点和负号的字符

偏差为1023,因此最小的基2指数为2^-1022,约为10^-308,因此最长的指数为5个带“E”和负号的字符


19+5==24个字符的长度?是什么引起了人们的好奇心?你可以在不同的平台上尝试Windows、MacOSX(不同的处理器)、Linux。这是在
sun.misc.FloatingDecimal.toJavaFormatString(d)中为Oracle java做的
因此没有保证。除了8个字节外,双精度可以用有限的小数进行合理的近似。@JoopEggen:Double的Javadoc.toString意味着一个确定性算法,应该是独立于平台的。看看我拥有的(有些旧的)Java源代码,分配的缓冲区(inside sun.misc.FloatingDecimal)的大小为26个字符。因此,这可能是一个上限。在使用西班牙语语言环境配置的JVM中,要注意负无穷大,它是
-Extremadamentemierdaenorme
,它是27个字符。您是否有“52位尾数中可以存储的十进制数最多是17”的引用?@LouisWasserman-这很容易通过将一个52位的全1二进制数转换为十进制来确认。你可以使用Windows计算器,以十六进制的13个“F”数字开始,然后转换为十进制。
System.out.println(Long.toString((1L尾数是小数点右边的基数-2。最高有效位是1/2,其次是1/4,其次是1/8,依此类推。我已经更新了我的答案,并添加了一个解释链接。