我想知道可以使用什么类型的算法将类似“4.72”的内容转换为浮点数据类型,等于
float x = 4.72;
答案 0 :(得分:10)
scanf
,operator>>
,strtof
将是明显的选择。
也是atof
,但是,就像atoi
一样,它没有办法告诉你输入中有错误,所以通常最好避免两者
答案 1 :(得分:10)
对于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 );
答案 2 :(得分:3)
对于C
strtod()
和C99
朋友strtof()
和strtold()
(同一链接上的说明)已经实施了该算法。
如果您在编写自己的问题时遇到问题,请发布您的代码和有关它的具体问题。
答案 3 :(得分:3)
对于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”。
答案 4 :(得分:3)
正如您要求的算法而不是方法,这是我对简单算法(以及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);
}
答案 5 :(得分:1)
您可以使用boost:lexical_cast
http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm
答案 6 :(得分:1)
我假设您需要一个实际的算法,而不是已经完成它的库函数。我没有时间编写和测试实际代码,但这就是我要做的事情:
由于在此循环的每次迭代中在基数10和基数2之间进行转换,因此从此算法获得的结果可能不是与原始值最接近的可能二进制表示。我真的不知道改善它的好方法......也许其他人可以用它来填补它。
答案 7 :(得分:0)
atof()函数可能会有所帮助。 http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
答案 8 :(得分:0)
来自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;
}