如何将字符串转换为浮点数?
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.00
和atoll()
的原因是它在找到第一个非数字时停止解析。
*注意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()
返回float
,strtold()
返回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", &f);
一样有溢出的 UB - 所有这些目前都不符合“稳健性”。 atof()
的用途有限: 示例:确保字符串由 (-,+,0-9,.) 组成并且长度低于 30,与重写 atof()
相比是微不足道的。在这样的字符串上调用 atof()
具有明确定义的行为。 IAC,从 C11 开始(我认为也是 C17),atof()
没有贬值 - 所以答案实际上是不正确的,sscanf()
这里没有任何改进。【参考方案8】:
你想使用 atof() 函数。
http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
【讨论】:
以上是关于如何将字符串转换为浮点数?的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:无法将字符串转换为浮点数:'2100 - 2850'