文字与计算中的浮点精度

swc*_*wch 5 java floating-point numbers

我想知道为什么 Java 中的浮点数在初始化为文字时可以表示精确的值,但是当它们表示某些计算的结果时它们是近似值。例如:

double num1 = 0.3;
double num2 = 0.1 + 0.2;
System.out.println(num1);
System.out.println(num2);
Run Code Online (Sandbox Code Playgroud)

为什么结果是:

0.3
0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

并不是:

0.30000000000000004
0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

当没有 0.3 的精确二进制表示时。我知道 BigDecimal 类,但我不太了解这种原始数字不一致。

das*_*ght 5

这三个数字都不能完全表示为 a double。得到不同结果的原因是添加0.1到后的值0.2具有与 不同的表示错误0.3。大约 5.5E-17 的差异足以在打印结果时造成差异(演示)。

double a = 0.2;
double b = 0.1;
double c = 0.3;
double d = a+b;
double e = d-c; //  This is 5.551115123125783E-17
Run Code Online (Sandbox Code Playgroud)

  • 为了进一步清晰,这里有一个 [demo](http://ideone.com/Vf4Kpz),它打印了所有数字的表示。 (3认同)