添加非常小的Double值(Java)

时间:2017-04-21 11:53:31

标签: java double min addition

我很想知道,为什么我简单地添加一些双值会导致Java中出现以下结果:

double a = 1 + 1E-10; // 1.0000000001 (as expected)
double b = 1 + 1E-15; // 1.000000000000001 (as expected)
double c = 1 + 1E-20; // 1.0 (why?)

我以为我至少可以添加Double.MIN_VALUE的值,这似乎是4.9E-324。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

正如@Turing85指出的那样,double有11位指数和53位尾数。

我们在这里计算的是1.0 + 1E-20。为了表示该数字(更精确地超过1.0),我们需要至少21位精度的十进制数字或71位。这比尾数中double提供的精度更高。

因此,最接近可表示 double的数字为1.0 + 1E-20是...... 1.0。这就是你得到的结果。

欢迎来到神秘的浮点运算世界。

答案 1 :(得分:0)

你这里没有做错任何事。小数精度的概念就在眼前。浮点数总是存在错误。 常见错误值表示为:

- 1/2E-n <= error <=  1/2E-n

其中n是您定义的小数位数。

可以找到有关浮点错误的更多信息here