如何将字符串转换为浮点数?

Posted

技术标签:

【中文标题】如何将字符串转换为浮点数?【英文标题】: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

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

【问题讨论】:

【参考方案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】:

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

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

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

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

另外,请注意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】:

你想使用 atof() 函数。

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

【讨论】:

以上是关于如何将字符串转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为浮点数?

如何将时间字符串(M:SS)转换为浮点数

如何将字符串转换为浮点数? (温度转换器)

ValueError:无法将字符串转换为浮点数:'2100 - 2850'

如何在python中将23位浮点数从字符串转换为浮点数并返回?

Pandas / 如何将存储为字符串的科学记数法转换为浮点数?