有没有一种方法将文本字符串转换为浮点数,例如1e100?

3

很不幸,在我手头的日志中有一些用1.00e4这种表示法的字符串,我知道我可以使用printf和"%e"说明符来创建该表示法,但我该如何读取它呢?

不幸的是,strtof和scanf似乎在"1e100"上返回0.00000,我需要为此编写自己的解析器吗?

(更新)

我的输入是:
字符串"4.1234567e5"或"4.5e5"

期望输出:
浮点数412345.67或整数"450000"


请问您的输入是什么,您期望得到什么样的输出? - ubiquibacon
我已经更新了一个例子,PHP似乎能够轻松地将字符串解析为数字,这一定是相当简单的。 - Tim N.
3个回答

3
您可以使用以下方法
double atof( const char * str );

2

从这段代码开始:

#include <stdio.h>
int main (void) {
    double val;
    double val2 = 1e100;
    sscanf ("1e100", "%lf", &val);  // that's an letter ELL, not a number WUN !
    printf ("%lf\n", val);          // so is that.
    printf ("%lf\n", val2);         // and that.
    return 0;
}

它的输出结果为:
10000000000000000159028911097599180468360810000000000...
10000000000000000159028911097599180468360810000000000...

它不完全等于1100的原因是因为IEEE754浮点值的性质。将其更改为:

#include <stdio.h>

int main (int argc, char *argv[]) {
    double val;
    int i;
    for (i = 1; i < argc; i++) {
        sscanf (argv[i], "%lf", &val);
        printf ("   '%s' -> %e\n", argv[i], val);
    }
    return 0;
}

运行它并使用您的示例参数,结果如下:

pax$ ./qq 4.1234567e5 4.5e5 3.47e10 3.47e-10
   '4.1234567e5' -> 4.123457e+05
   '4.5e5' -> 4.500000e+05
   '3.47e10' -> 3.470000e+10
   '3.47e-10' -> 3.470000e-10

糟糕,这就是我想到的,但我刚刚测试了一下,例如 1e-5 失败了,所以 scanf 中的负数符号不可行? - Tim N.
建议您再试一次,@Tim,这对我来说很好用,两行代码都是 0.000010。请按照我的第二个代码块完全相同的方式输入。 - paxdiablo
很奇怪,它对某些情况有效,但是像 sscanf ("3.47e-10", "%lf", &val); 这样的情况却不行,在我的 GCC 编译器上返回 0.00000(我不确定是否有问题或者是一个限制)。 - Tim N.
我得到的是 34700000000.000000。你确定你使用的是 double 而不是 float 吗? - paxdiablo
就算没什么价值,我实际上使用的是gcc。版本是CygWin 1.7下的4.3.4版。 - paxdiablo
显示剩余4条评论

0

如果我使用浮点数据类型,它就无法工作。也许问题就出在那里。


1
好的,1e100在浮点数中无法表示,它们只能达到1e38左右。双精度浮点数可以达到1e307左右。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接