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

标签 java double

据我了解,将任何 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/

相关文章:

java - 如何在方法内部测试匿名类对象

mysql - MySQL 中丢失小数点

c - 偏离其相应 long by delta 的第一个 double 是什么?

java - 数据因 JPA AttributeConverter 而丢失?

java - 将子句转换为 CNF

c++ - 如何查找输入的 double 是否是 0.05 的倍数

c# - .NET 上的 double 问题

c++ - 如何在一个区间内循环遍历 double 的每个值?

java - Spring WS WSDL自动暴露: xsd import are not followed

java - 检测图像中的矩形会产生不需要的结果(opencv,java)