我很想知道,为什么我简单地添加一些双值会导致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。
我在这里做错了什么?
答案 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。