据我了解,将任何 double 值赋给变量时,都会经过以下步骤:
- 转换为二进制。
- 对科学记数法进行一些转换。
- 转换为 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/