988-6ren">
gpt4 book ai didi

java - double 的十进制显示精度损失

转载 作者:行者123 更新时间:2023-12-05 05:40:32 24 4
gpt4 key购买 nike

为什么后面的值显示有出入?

double x = (double)988530483551494912L;
System.out.printf("%f%n", x); -> 988530483551494910.000000
System.out.println(Double.toString(x)); -> 9.8853048355149491E17
System.out.println(new BigDecimal(x)); -> 988530483551494912

如您所见,toString()%f 转换都丢失了最后一位数字的精度。但是,我们可以看到最后一位数字实际上是精确的,因为 BigDecimal 转换保留了它。

最佳答案

感谢@user16320675 的评论,我正在回答我自己的问题。原因是数字 988530483551494912L 的精度超出了 double 类型精度的限制,并且 Double.toString()(和类似的 %f) 将根据文档仅使用将 double 数字与相邻数字区分开来所需的最少有效数字。相邻数字是那些与原始数字在其两侧具有最小可表示差异的数字。

这可以使用 Math.nextAfter 显示相邻数字来演示:

import static java.lang.Math.nextAfter;
double x = (double)988530483551494912;
System.out.println(nextAfter(x, Double.MIN_VALUE)); ==> 9.8853048355149478E17
System.out.println(x); ==> 9.8853048355149491E17
System.out.println(nextAfter(x, Double.MAX_VALUE)); ==> 9.8853048355149504E17

因此,正如我们所见,添加更多有效数字没有意义,因为此字符串表示形式已经有足够的数字来区分数字与相邻值。

但是,仍然存在一个问题:它显示了 17 个有效数字,但 16 个就足够了。我不确定为什么它会发出额外的最后一位数字。

关于java - double 的十进制显示精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72393237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com