【问题标题】:How to convert string to float?如何将字符串转换为浮点数?
【发布时间】:2011-12-18 13:23:25
【问题描述】:
#include<stdio.h>
#include<string.h>

int main() 
{
    char s[100] ="4.0800" ; 

    printf("float value : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}

我希望输出应该是4.08000000,而我只有4.00000000

有没有办法得到点后面的数字?

【问题讨论】:

    标签: c floating-point type-conversion atof strtod


    【解决方案1】:

    通过使用 sscanf 我们可以将字符串转换为浮点数。

    #include<stdio.h>    
    #include<string.h>    
    
    int main() 
    {
        char str[100] ="4.0800" ;     
        const char s[2] = "-";   
        char *token;
        double x;
       /* get the first token */ 
       token = strtok(str, s);
       sscanf(token,"%f",&x);
        printf( " %f",x );
    
        return 0; 
    }
    

    【讨论】:

      【解决方案2】:
      Main()  {
          float rmvivek,arni,csc;
          char *c="1234.00";
          csc=atof(c);
          csc+=55;
          printf("the value is %f",csc);
      }
      

      【讨论】:

        【解决方案3】:

        为什么不能使用 atof() 函数将字符串转换为双精度值?

        成功时,atof() 函数将转换后的浮点数作为双精度值返回。 如果无法执行有效转换,则函数返回零 (0.0)。 如果转换后的值超出可表示值的范围,则会导致 未定义的行为

        参考:http://www.cplusplus.com/reference/cstdlib/atof/

        改用函数strtod(),更健壮。

        试试这个代码:

        #include<stdio.h>
        #include<string.h>
        #include<stdlib.h>
        int main()
        {
            char s[100] = "4.0800";
            printf("Float value : %4.8f\n",strtod(s,NULL));
            return 0;
        }
        

        你会得到以下输出:

        Float value : 4.08000000

        【讨论】:

        • 太好了,我尝试使用 atof() 找到错误 2 小时,直到我看到这个。谢谢!
        • 请注意,strtod 依赖于语言环境。有关详细信息,请参阅 sam hocevar 的答案。
        • strtod 是否超出了标记为 c 的问题的范围?我知道它是 C++ 的,但是我正在寻找 ANSI C :c
        • @LudovicZenohateLagouardette strtod() 在 C 中定义并在范围内。 (C11dr 7.22.1.3 strtod、strtof 和 strtold 函数)
        【解决方案4】:

        请改用atof()strtof()*:

        printf("float value : %4.8f\n" ,atof(s)); 
        printf("float value : %4.8f\n" ,strtof(s, NULL)); 
        

        http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
        http://www.cplusplus.com/reference/cstdlib/strtof/

        • atoll() 用于整数。
        • atof()/strtof() 用于浮点数。

        你只得到4.00atoll()的原因是它在找到第一个非数字时停止解析。

        *注意strtof() 需要 C99 或 C++11。

        【讨论】:

        • printf("浮点值 : %4.8f\n" , atof(s)); # 输出:浮点值:0.00000000
        • 拒绝推荐 atof,它忽略了解析错误,而不是 strtof。你应该知道得更好;-)
        • @Zack 不能说我知道两年前就已经存在了。特别是因为它似乎是一个 C99/C++11 函数。
        • @Mysticial 哦,对了,所有的短浮点函数都是 C99。但是strtod 在 C89 中,与atof 具有相同的优势(明确报告解析错误)。
        • 请注意,atof() 返回一个 double,尽管它的名称。类比是strtod(),因为strtof() 返回floatstrtold() 返回long double
        【解决方案5】:
        double x;
        
        char *s;
        
        s = " -2309.12E-15";
        
        x = atof(s);     /* x = -2309.12E-15 */
        
        printf("x = %4.4f\n",x);
        

        【讨论】:

          【解决方案6】:

          不幸的是,没有办法轻松做到这一点。每个解决方案都有其缺点。

          1. 直接使用atof()strtof():这是大多数人会告诉你做的,并且在大多数情况下都会起作用。但是,如果程序设置了区域设置或它使用设置区域设置的库(例如,显示本地化菜单的图形库)并且用户将其区域设置设置为小数点分隔符不是 . 的语言(例如如fr_FR,其中分隔符为,)这些函数将在.处停止解析,您仍将得到4.0

          2. 使用atof()strtof() 但更改区域设置;在致电atof() 或其他类似电话之前,只需致电setlocale(LC_ALL|~LC_NUMERIC, "");setlocale 的问题是它对进程来说是全局的,你可能会干扰程序的其余部分。请注意,您可以使用 setlocale() 查询当前语言环境并在完成后恢复它。

          3. 编写您自己的浮点解析例程。如果您不需要指数解析或十六进制浮点数等高级功能,这可能会非常快。

          另外,请注意4.08 的值不能完全表示为浮点数;您将获得的实际值为4.0799999237060546875

          【讨论】:

            【解决方案7】:

            使用atof()

            但这已被弃用,请改用它:

            const char* flt = "4.0800";
            float f;
            sscanf(flt, "%f", &f);
            

            http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

            atof() 在失败和转换0.0 时返回0,最好不要使用它。

            【讨论】:

            • 建议sscanf() 也好不到哪里去。我建议改为strtod()
            • printf("浮点值 : %4.8f\n" , atof(s)); # 输出:浮点值:0.00000000
            • "使用 atof() 但这已被弃用," --> 请发表参考。
            • @chux 即使atof() 没有被弃用,它也是不精确的、危险的并且最终对于编写健壮的代码毫无用处。永远不要使用atof()。它无法返回错误,如果输入超出可表示范围,则调用未定义的行为。因此,安全使用它的唯一方法是以其他方式完全解析输入,并确保在调用 atof() 之前输入有效 - 从而使 atof() 完全无用。
            • @AndrewHenle 没有理由认为atof()strtod() 相比有任何精度 差异——所以不精确 不是问题。 atof()*scanf(flt, "%f", &amp;f); 一样有溢出的 UB - 所有这些目前都不符合“稳健性”。 atof() 的用途有限: 示例:确保字符串由 (-,+,0-9,.) 组成并且长度低于 30,与重写 atof() 相比是微不足道的。在这样的字符串上调用 atof() 具有明确定义的行为。 IAC,从 C11 开始(我认为也是 C17),atof()没有贬值 - 所以答案实际上是不正确的,sscanf() 这里没有任何改进。
            【解决方案8】:

            【讨论】:

              猜你喜欢
              • 2011-11-25
              • 1970-01-01
              • 2018-02-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-25
              相关资源
              最近更新 更多