gpt4 book ai didi

java - double用二进制科学计数法不能准确表示,Java如何精确显示?

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:03 30 4
gpt4 key购买 nike

据我了解,将任何 double 值赋给变量时,都会经过以下步骤:

  1. 转换为二进制。
  2. 对科学记数法进行一些转换。
  3. 转换为 IEEE754。

第 1 步和第 3 步都可能会引入一些不准确的信息。所以存储在内存中的值已经不准确了。

但令人惊讶的是,如果我不对这个 double 进行任何计算而只是将其打印出来,如下所示:println(0.2d)

甚至

println(1245.1325415d)

只要 double 不是太长,结果总是准确的。

IEEE754格式转回Base10格式有什么技巧吗?

最佳答案

对于每个 double D,都有一个可以转换为 D 的小数范围。以 D 作为参数的 Double.toString 会生成该范围内有效数字最少的成员。通常,“不太长”的小数是其范围内有效数字最少的成员,因此它是您转换为字符串时得到的小数。

例如:

import java.math.BigDecimal;

public class Test {
public static void main(String[] args) {
double d1 = 0.4;
double d2 = 0.400000000000000000001;
System.out.println(d1);
System.out.println(d2);
System.out.println(new BigDecimal(d1));
}
}

显示:

0.4
0.4
0.40000000000000002220446049250313080847263336181640625

“0.4”和“0.400000000000000000001”都在其成员转换为精确值为0.40000000000000002220446049250313080847263336181640625的double的范围内。 0.4 是该范围中最短的成员,因此它是 toString 转换的结果。它也是一个“不太长”的小数。

关于java - double用二进制科学计数法不能准确表示,Java如何精确显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22526897/

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