当我看到这个时,我正在练习一些c编程:
#include <stdio.h>
int main (void){
printf("result %.50lf",(double)10.0/10000000.0);
return 0;
}
结果是0.00000099999999999999995474811182588625868561393872
有人可以解释一下为什么会这样吗?
答案 0 :(得分:0)
double
的内部表示是一个二进制浮点编码,不能精确地表示所有(或实际上大多数)小数部分,出于同样的原因,例如1/3不能精确用十进制表示,10.0 / 10000000.0不能用二进制精确表示。
此外,64位双精度二进制浮点具有大约15个十进制有效数字的精度,因此尝试输出50个小数位总是会以无关且无意义的数字结束。您在double的精度范围内的实际结果是0.000000999999999999999。
另请参阅:What Every Programmer Should Know About Floating-Point Arithmetic