C语言中,float类型怎么储存小数点后六位的,第六位会四舍五入么?

float x;
double y;
x=1.234567890000;
y=9.87654321;
printf("%f\n",x);
printf("%.12lf\n",x);
printf("%f\n",y);
printf("%.12lf\n",y);
输出结果是
x=1.234567880630;
x=1.234568;
y=9.876543210000;
y=9.876543;

两次输出x的第六位为什么不一样?
第一次输出的y是后面补上4个0,为什么第一次输出的x不是?

你上面的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。

温馨提示:答案为网友推荐,仅供参考
相似回答