[英]string to float conversion?
我想知道什么样的算法可以用来将类似“4.72”的东西变成浮点数据类型,等于
float x = 4.72;
scanf
, operator>>
for istreams, strtof
将是明显的选择。
还有 atof
,但是,像atoi
,它没有办法告诉你有输入错误,所以一般情况下最好是避免两者。
对于C ++,您可以使用boost :: lexical_cast :
std::string str( "4.72" );
float x = boost::lexical_cast< float >( str );
对于C,您可以使用sscanf:
char str[]= "4.72";
float x;
sscanf( str, "%f", &x );
对于C
strtod()
和C99
朋友, strtof()
和strtold()
(在同一链接上的描述)已经实现了该算法。
如果您在编写自己的问题时遇到问题,请发布您的代码和有关它的具体问题。
对于C ++这是我使用的算法:
bool FromString(const string& str, double& number) {
std::istringstream i(str);
if (!(i >> number)) {
// Number conversion failed
return false;
}
return true;
}
我过去使用atof()进行转换,但我发现这有问题,因为如果无法进行有效转换,它将返回(0.0)。 所以,你不知道它是否失败并返回零,或者字符串实际上是否为“0”。
正如您所要求的算法而不是方法,这是我对简单算法(以及C中的实现)的解释:
我想,阅读代码可能会更容易。 所以这是代码:
float atof(char *s)
{
int f, m, sign, d=1;
f = m = 0;
sign = (s[0] == '-') ? -1 : 1;
if (s[0] == '-' || s[0] == '+') s++;
for (; *s != '.' && *s; s++) {
f = (*s-'0') + f*10;
}
if (*s == '.')
for (++s; *s; s++) {
m = (*s-'0') + m*10;
d *= 10;
}
return sign*(f + (float)m/d);
}
你可以使用boost:lexical_cast
http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm
我假设您需要一个实际的算法,而不是已经完成它的库函数。 我没有时间编写和测试实际代码,但这是我要做的:
由于在该循环的每次迭代中在基数10和基数2之间进行转换,因此从该算法得到的结果可能不是与原始值最接近的可能二进制表示。 我真的不知道改善它的好方法......也许其他人可以用它来说明。
atof()函数可能会有所帮助。 http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
从cplusplus.com :“ stringstream
提供操作字符串就好像它们是输入/输出流的接口。”
您可以初始化stringstream
与您的字符串,然后读取来自浮法stringstream
使用operator>>
就像你会与cin
。
这是一个例子:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main() {
string s = "4.72";
stringstream sstrm(s);
float x;
sstrm >> x;
cout << x << endl;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.