我知道有几个主题与我的相同,但我仍然没有真正理解它,因此我希望有人可以以一种更简单但明确的方式为我解释该主题,而不是粘贴其他主题的链接,谢谢
这是示例代码:
int a = 960;
int b = 16;
float c = a*0.001;
float d = a*0.001 + b;
double e = a*0.001 + b;
printf("%f\n%f\n%lf", c, d, e);
输出:
0.960000
16.959999
16.960000
我的两个问题是:
答案 0 :(得分:1)
之所以产生相同的小数位数,是因为6
是默认值。您可以按照下面的编辑示例进行更改,语法为%.*f
。 *
可以是如下所示的数字,也可以是第二种情况下作为另一个参数提供的数字。
#include <stdio.h>
int main(void) {
int a = 960;
int b = 16;
float c = a*0.001;
float d = a*0.001 + b;
double e = a*0.001 + b;
printf("%.9f\n", c);
printf("%.*f\n", 9, d);
printf("%.16f\n", e);
}
程序输出:
0.959999979 16.959999084 16.9600000000000009
现在,小数点后的小数位表明没有结果是准确的。原因之一是因为0.001
不能完全编码为浮点值。还有其他原因也被广泛讨论。
一种简单的理解原因的原因是,float
具有大约2^32
个可以编码的不同值,但是float
范围内的实数是无限的,并且其中只有2^32
个可以准确地表示。对于小数1/1000
,用二进制表示是一个循环值(小数1/3
用十进制表示)。
答案 1 :(得分:0)