不精确的浮动划分

时间:2015-03-22 17:18:39

标签: c operation

当我看到这个时,我正在练习一些c编程:

#include <stdio.h>

int main (void){
printf("result %.50lf",(double)10.0/10000000.0);
return 0;
}

结果是0.00000099999999999999995474811182588625868561393872

有人可以解释一下为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

double的内部表示是一个二进制浮点编码,不能精确地表示所有(或实际上大多数)小数部分,出于同样的原因,例如1/3不能精确用十进制表示,10.0 / 10000000.0不能用二进制精确表示。

此外,64位双精度二进制浮点具有大约15个十进制有效数字的精度,因此尝试输出50个小数位总是会以无关且无意义的数字结束。您在double的精度范围内的实际结果是0.000000999999999999999。

另请参阅:What Every Programmer Should Know About Floating-Point Arithmetic