#include <stdio.h>
#include <conio.h>
int main()
{
int a = 8; float b = 3.9; char c='a';
float hasil = a+b+c;
printf("%f", hasil);
getch();
return 0;
}
我得到了结果 108.900002
那么,0.000002是什么?
如果我改为
float hasil = a+b;
然后结果将是 11.900000
然后如果我们将char转换为浮动,那么肯定会增加值0.000002? 真的吗 ?如果是,为什么?
谢谢你
答案 0 :(得分:3)
char c = 'a'
将值97
分配给c
。 97 + 8 + 3.9
实数为108.9
,但它没有精确表示为浮点数。假的0.000002
来自哪里。正如Keith Thompson指出的那样,实际值很可能是108.90000152587890625
,但%f
格式说明符可能会对其进行舍入。
这是因为只有有限数量的浮点数,而实际数字却不计其数。
答案 1 :(得分:2)
11.9和108.9都不能在float
中准确表示。如果您使用double
,您将获得更好的准确性。
如果更改打印精度,您将看到它们的准确程度。
#include <stdio.h>
int main()
{
int a = 8; float b = 3.9; char c='a';
float hasil = a+b;
printf("%.16f\n", hasil);
hasil = a+b+c;
printf("%.16f\n", hasil);
return 0;
}
输出:
11.8999996185302734
108.9000015258789062
通过将类型更改为double
,我可以获得更准确的输出:
#include <stdio.h>
int main()
{
int a = 8; double b = 3.9; char c='a';
double hasil = a+b;
printf("%.16f\n", hasil);
hasil = a+b+c;
printf("%.16f\n", hasil);
return 0;
}
输出:
11.9000000000000004
108.9000000000000057
这些结果来自在Linux桌面上运行的gcc。我怀疑你会得到类似的,如果不完全相同,也会产生其他常见的编译器。