0

我似乎在atof()函数没有正确转换某些值时遇到了一些奇怪的问题。对于相同的值,atoi()可以完美运行。
这是我正在做的一个小片段:

...
// frequencies is a std::string in format a10d50f20 etc. i.e. letter|frequency in %  
// 6 - 48 characters, always correctly formatted 
for (size_t i = 0; i < frequencies.size(); i+=3)
{
  // #1
  double percentage = atof(frequencies.substr(i+1, i+2).c_str()) / 100;
  // #2
  double percentage = static_cast<double>(atoi(frequencies.substr(i+1, i+2).c_str())) / 100;

  cout << frequencies[i] << " - " << percentage << endl;
}
...

出于某种奇怪的原因,只有方法#2 似乎总是能正常工作。

样本输出

FOR:频率=“a30b30c40”

两种方法都可以正常工作,给我:
a - 0.30
b - 0.30
c - 0.40

FOR:频率=“a10b10c10d10e10f50”

使用atof()我得到:
a - 0.10
b - 0.10
c - 1000000000.00 !?
d - 1000000000.00 !?
e - 0.10
f - 0.50
atoi() 正确地给了我这个:
a - 0.10
b - 0.10
c - 0.10
d - 0.10
e - 0.10
f - 0.50

ps 我不能使用 std::stod 因为 mingw...

4

2 回答 2

4

的第二个参数substr是长度,而不是偏移量。

当您调用时substr(i+1, i+2)d您将获得字符串的整个剩余部分,然后将其解析为指数符号,10e10即 10 * 10 10

于 2014-04-17T16:56:23.160 回答
2

datof函数取为10e1010 x (10 ^ 10) = 1000000000.0(工程符号/标准形式)。

你真的得到了 1000000000.0c吗?我不知道是否也发生了同样的事情。

于 2014-04-17T16:54:14.573 回答