将一个浮点变量与其包含的值进行比较

5 c floating-point

#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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的答案:

YES 
NO
Run Code Online (Sandbox Code Playgroud)

我一直在想,如果我将浮点值与双倍值进行比较.它永远不会匹配它.除非值是纯整数.但这里浮动"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
Run Code Online (Sandbox Code Playgroud)

这种舍入效应如何在某些情况下显示,而在其他情况下则不然.

谁能解释一下呢."WE"应该如何判断float变量中的值何时与其中包含的值匹配,何时不匹配?

Dee*_*epu 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)在对其执行比较或相等运算时会给出不正确的结果。

  • @MichaelSmith 它必须是五的倍数取决于小数点后的位数。小数点后 d 位的数字是 1/(10^d) 的整数倍。如果数字表示 5^d 的倍数,则它也必须是 1/(2^d) 的整数倍。0.375小数点后有3位,375就是3*125,5^3的整数倍。0.425 不能完全表示为二进制分数,因为 425 虽然可以被 25 整除,但不能被 125 整除。 (2认同)