Possible Duplicate:
strange output in comparison of float with float literal
当我尝试比较 2 个相同的 float
值时,它不会在以下代码中打印“相等值”:
void main()
{
float a = 0.7;
clrscr();
if (a < 0.7)
printf("value : %f",a);
else if (a == 0.7)
printf("equal values");
else
printf("hello");
getch();
}
提前致谢。
虽然许多人会告诉您始终将 float 与 epsilon 进行比较(这通常是个好主意,尽管它应该是被比较值的百分比而不是固定值),但实际上没有必要,因为你正在使用常量。
您的具体问题是:
float a = 0.7;
使用double 常量0.7
创建一个单 精度数字(失去一些精度)同时:
if (a == 0.7)
将比较两个 double 精度数字(a
首先提升)。
将 double 0.7
转换为 float a
时丢失的精度在将 a
提升回 double 时不会恢复。
如果您将所有这些 0.7
值更改为 0.7f
(以强制 float 而不是 double),或者如果您只是将 a
设为 a double,它会工作得很好——我现在很少使用 float
除非我有大量的 float 并且需要节省空间。
您可以通过以下方式看到这一点:
#include <stdio.h>
int main (void){
float f = 0.7; // double converted to float
double d1 = 0.7; // double kept as double
double d2 = f; // float converted back to double
printf ("double: %.30f\n", d1);
printf ("double from float: %.30f\n", d2);
return 0;
}
这将输出如下内容(稍作修改以显示差异):
double: 0.6999999|99999999955591079014994
double from float: 0.6999999|88079071044921875000000
\_ different beyond here.