如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]

Posted

技术标签:

【中文标题】如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]【英文标题】:How to convert strings to doubles in C++ using stringstream [closed] 【发布时间】:2016-12-11 22:47:25 【问题描述】:

我正在尝试从向量中获取字符串并使用 stringstream 将它们转换为双精度。但是,当我运行此代码时:

  double tempDob;
  stringstream ss;
  ss << tempVec[3];
  ss >> tempDob;

我得到的是奇怪的东西,而不是普通的替身。这是一个例子: 原始字符串(tempVec[3] 的计数):

        15000000
62658722.54
91738635.67
        20
        29230756.5
        12

转换的双打(tempDob的计数):

1.5e+07
6.26587e+07
9.17386e+07
2.92308e+07
4.70764e+07
3.53692e+07

如何通过 stringstream 将这些字符串正确转换为双精度值?谢谢!

【问题讨论】:

最好发minimal reproducible example。 您确实意识到15000000 等于1.5e+07;第二个是“1.5 乘以 10 的 7 次方”。 【参考方案1】:

像这样:

istringstream is( somestring );
double d;
is >> d;

当然你自己的代码会有错误处理。

【讨论】:

那实际上是做什么的? 精度和格式有问题? @πάντα ῥεῖ 如果可能的话,它将某个字符串中的第一个空格分隔的标记转换为双精度。 感谢其他问题的链接,现在我知道它给了我科学记数法。我尝试使用“固定”来修复它,但这仍然给了我科学记数法: stringstream ss; ss > 固定 >> d;【参考方案2】:

您可以像这样重复使用相同的字符串流:

std::vector<std::string> theVec  "        15000000",
                                  "62658722.54",
                                  "91738635.67",
                                  "        20",
                                  "        29230756.5",
                                  "        12" ;
std::stringstream ss;
for (auto const& s : theVec)

    ss.clear();
    ss.str(s);
    double d;
    ss >> d;
    std::cout << d << "\n";

【讨论】:

谢谢,很高兴知道。这次虽然我在 ss.clear() 的 for 循环中使用它 @JamesHall ss.clear() 是必要的,我添加了它,但请注意它不会清除字符串而只是清除标志。这与std::string::clear 等不同。

以上是关于如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 StringStream/c_str() 损坏

在 C++ 中使用 stringstream 获取字符串中的所有 N 个连续字符

❥关于C++之stringstream典型用法

❥关于C++之stringstream典型用法

使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串

C++使用stringstream分割字符串