#include<stdio.h>
int main()
{
float a,b;
a=4.375;
b=4.385;
if(a==4.375)
printf("YES\n");
else
printf("NO\n");
if(b==4.385)
printf("YES\n");
else
printf("NO\n");
return 0;
}
回答此代码:
YES
NO
我一直在想,如果我将浮点数与double值进行比较。它永远不会匹配它。除非值是纯整数。但这里浮动“a”的确是4.375,但“b”不是
printf("%0.20f\n",a);
printf("%0.20f\n",b);
This prints :
4.37500000000000000000
4.38500022888183593750
but if i print
printf("%0.20f\n",4.475);
It prints 4.47499990463256835938
这种舍入效应如何在某些情况下显示,而在其他情况下则不显示。
任何人都可以解释这一点。 “WE”应该如何判断float变量中的值何时与其中包含的值匹配,何时不匹配?
答案 0 :(得分:1)
只有当小数部分可以用0.5
,0.25
,......等二进制分数求和时,从小数部分到二进制分数的转换才是精确的。
例如在您的情况下
0.375 = 0.25 + 0.125 = 2 -2 + 2 -3
因此可以使用二进制分数精确表示。
无法通过精确使用二进制分数来表示数字0.385
。因此,0.5
,0.25
,0.125
,......等数字或这些数字的组合可以完全表示为浮点数。其他像0.385在对它们执行比较或相等操作时会给出不正确的结果。
答案 1 :(得分:1)
浮点不是魔法。 它们包含一个确切的值,如果你将它与它进行比较,它们将比较相等。这两个问题是 1)由于精度问题,某些操作并不总是完全准确。如果你向float中添加一个然后减去一个,那么添加一个可能会导致最低有效值位的某些精度损失,当你减去它时,你不会回到你期望的相同值。 2)不可能精确地表示浮点二进制格式中的每个十进制值。例如,无法在浮点二进制数中存储精确值0.1,这与您无法使用多少位数无法将1 / 3.0的值精确地写为十进制值完全相同。 / p>
但在您的情况下如果您存储一个值并将其与相同的值进行比较,则它们应该相等,因为它们都以相同的方式具有相同的问题。 你的问题虽然是你没有比较喜欢。 4.375和4.385不是浮点数它们是双倍的并且转换为存储,因此当您稍后比较它们时,转换后的值可能不完全相同。如果你写4.385f和4.385f来使用浮点值,你应该两次都得到YES。