请问C语言资深高手

来源:百度知道 编辑:UC知道 时间:2024/07/05 05:20:47
我定义的是float变量
用函数scanf("%f",&a)输入
比如我输入0.10
用printf("%12.9f",a);显示的却是0.100000001
输入0.41
显示的却是0.409999996
请问到底是遇到什么样的问题
存储的数据跟输入的数据不是一样?
或者说显示的跟输入的不一样?

你定义的12.9f 格式超出了float变量的数值范围
小数位默认为6位小数而你却设置为9

你如果用double定义a变量
scanf("%lf",&a);
printf("%lf",a);
就能正确输出啦!

我确定是超过float的长度范围了
你应当定义双精度的“double”
就如int 和long int的区别一样
main()
{ double a;
scanf("%lf",&a);
printf("%12.9lf\n",a);
}
float定义的数只能精确到小数点后六位,如果超过
电脑就会随机赋值……
就是这样……

这是正常的,浮点数存储本来就是不绝对精确的。
这样引出另外一个问题,就是浮点数的(是否相等)比较,不能像整数那样。
比如说,先输入 a = 0.1 再输入 b = 0.1 比较 a 和 b 是否想等,应该这样: fabs(a - b) < 0.000001 这里是比较两数之差的绝对值,如果前面的式子成立,那么 a 和 b 想等。
上面的 0.000001 不是绝对要用 0.000001 ,意思是,只要 是一个很小的数就行,一般就是取 小数点后 4 到 6 位 就行。即 也可以是 0.0001、0.00001 等等都行,但是不能太小。