你上面的2个结果写颠倒了吧? -- 这里面涉及到两个精度问题,即printf的指定精度,以及c的数据类似float和double的精度。
printf("%f\n",x);
%f, 没有指定精度(位数),c缺省设定的是小说点后6位,因此截短(四舍五入了)
printf("%.12lf\n",x);
这个指定了精度是小数点后面12位,因此输出12位;但之所和原来赋值时不同,是由于x的类型是float,而非double。 float的精度本身不如double。 这个话题由来已久,涉及到电脑中对小数的存储模式,简单而言,十进制的小数部分是按照1/2 + 1/4 + 1/8 + .... 这样的方式去逼近的。因此存在误差,也就是所谓的{存储精度}的问题。
float,32位对浮点数的表达是:0~22位=尾数;23~ 30是指数,31位则是符合位。
float x = 1.23456789 = 0x3F9E0652
double x = 1.23456789 = 0x3FF3C0CA4283DE1B
而y由于本身就是double (64位存储,尾数部分有52位表示,11位指数位和1个符号位构成),电脑的存储精度要高。
y=9.876543210000 = 0x4023C0CA4588F633
y=9.876543 = 0x412ABFFE00000000
因此如有可能,尽量用double。