c语言指针及malloc申请内存问题

void exchange(float *p ,float *q){
float a = *p;
*p = *q;
*q = a;
}

float a = 0;
float b = 0;
printf("请输入a = ");
scanf("%f",&a);
printf("请输入b = ");
scanf("%f",&b);

exchange(&a, &b);
printf("a = %f,b = %f", a, b);
为什么运行结果是这样:
请输入a = 559.4
请输入b = 66.4
结果:
a = 66.400002,b = 559.400024

没错啊。
记住:浮点数是有误差的。

估计是精度不够,都换成double试试。

不指定输出的精度的话,%f默认保留6位小数。浮点数存储的特点就是近似性,比如存储66.4可能内存中存储的是66.400002000。、
可以控制输出格式,比如%.1f保留1位小数。

浮点数本来就是有精度控制,它的大小都是一个范围,只是在你可以接收的精度范围下来处理它。

float 精度范围。

float 精度范围。

浮点数是有精度的,它存的是一个近似值,而不是绝对等于你所看到的值。