float a=67107842,b=512;
float c=a/b;
printf("%lf\n",c);
Run Code Online (Sandbox Code Playgroud)
为什么c131070.000000而不是正确值131070.00390625?
您的编译器float类型可能使用32位IEEE 754单精度格式.
67107842是一个26位二进制数:
11111111111111110000000010
Run Code Online (Sandbox Code Playgroud)
单精度格式表示大多数数字1.x乘以2的一些(正或负)幂,其中23位存储在二进制位置之后,1.隐含前导(非常小的数字是例外).
但是67107842在二进制位置后需要24位(表示为1.111111111111111000000001乘以2 25).由于只有存储23位的空间,最终1会丢失.所以a在这种情况下,它的值是错误的,而不是除法 - a实际上包含67107840(11111111111111110000000000),正好是131070*512.
如果你打印也可以看到这个a:
printf("%lf %lf %lf\n", a, b, c);
Run Code Online (Sandbox Code Playgroud)
给
67107840.000000 512.000000 131070.000000
Run Code Online (Sandbox Code Playgroud)