为什么float的相同值和使用函数atof转换为float的字符串不相等?

Aja*_*dav 2 c

我在C中编写了一个程序,当我比较浮点数和使用函数atof转换为float的字符串的相同值时,得到NOT EQUAL.

    #include<stdio.h>

    main(){

            char str[10] = "54.23" ;
            float val = 54.23 ;


            if( atof(str) == val )
                 printf("\nconverted correctly");
            else
                 printf("\nThen What is the use of atof\n ");


       }
Run Code Online (Sandbox Code Playgroud)

本程序显示输出:"那么atof有什么用"请告诉我为什么这个匿名行为会被这个程序显示出来?

Pau*_*l R 5

永远不要测试浮动/双打的平等性 ==

这是您的代码版本,它实际显示了有问题的值:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[10] = "54.23";
    float val = 54.23;

    printf("atof(str) = %.15f\n", atof(str));
    printf("      val = %.15f\n", val);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当你运行它时,你会看到:

$ gcc -Wall atof.c
$ ./a.out 
atof(str) = 54.229999999999997
      val = 54.229999542236328
$
Run Code Online (Sandbox Code Playgroud)

这些值接近于单精度浮点数的预期精度,但它们并不相同.此外,正如其他人所指出的那样,atof返回a double,因此您将float升级后的值double与a double返回的完整精度进行比较atof.

与此类问题一样,在使用代码中的浮点运算进一步处理之前,请先阅读此内容."带回家信息"是你永远不应该比较浮点数或双数==- 总是将绝对差值与适当的容差值进行比较.

  • "总是将绝对差值与容差值进行比较"是不好的建议,因为它通过产生误报问题解决了漏报问题.这里没有一个简单的单一解决方案; 浮点用户应该理解它并对他们使用的操作进行深思熟虑. (2认同)