【问题标题】:String in scientific notation C++ to double conversion科学计数法 C++ 中的字符串到双重转换
【发布时间】:2010-12-15 04:34:48
【问题描述】:

我有一个数据库,里面装满了像下面这样的双精度数:

1.60000000000000000000000000000000000e+01

有人知道如何在 C++ 中将这样的数字转换为双精度数吗?

有没有一种“标准”的方式来做这类事情?还是我必须推出自己的功能?

现在我正在做这样的事情:

#include <string>
#include <sstream>



int main() {
    std::string s("1.60000000000000000000000000000000000e+01");
    std::istringstream iss(s);
    double d;
    iss >> d;
    d += 10.303030;
    std::cout << d << std::endl;
}

谢谢!

【问题讨论】:

  • 什么类型的数据库?该字段周围的数据库架构是什么?
  • 您需要保持这个数字的精度是多少?如果保持高精度不是问题,您可以简单地“剪切”此字符串并使用普通 C 函数将其转换为双精度。
  • 请注意,您应该在读取字符串流后检查它的状态。阅读可能会失败。
  • 不是重复的,这是相反的操作。

标签: c++ math type-conversion scientific-notation


【解决方案1】:

您想要标准 c 函数 atof([A]SCII 到 [F]loat,但它实际上使用双精度而不是浮点数)。

【讨论】:

  • 这将比使用 C++ 流对象快得多。
  • @Heath:当您跳过重要步骤时,总是很容易快速:atof("0.0")atof("blah")。 (注意:我并不是要保护 C++ 流,它们比应有的慢。但它们确实以明确的方式指示错误。)
  • @sbi: strtodatof 一样工作,只是它允许您明确地检测错误。
  • @Ben:我不会批评建议strtod() 无法报告任何错误的答案。然而,这个答案建议atof()
  • @sbi,对,之前的评论不是针对您,而是后续和附加信息
【解决方案2】:

这样的?这将是“C++”的做法......

#include <sstream>
using namespace std;

// ...

    string s = "1.60000000000000000000000000000000000e+01";
    istringstream os(s);
    double d;
    os >> d;
    cout << d << endl;

打印 16。

【讨论】:

  • 如果你有提升,那么double d = boost::lexical_cast&lt;double&gt;(s) 会做同样的事情。
  • 如果我们将类型更改为“int”,这应该可以工作吗?我似乎只是得到零,例程可以不处理指数符号,即使它代表一个整数?
  • It's complicated 但可能不是。
  • 它可能值得另一个问题,但是从科学到双重的另一种方式呢?
  • 正如@BenFarmer 所说,将包含“1e4”的字符串转换为“int”似乎无法正常工作。我期待 10000,但我得到的只是 1。此外,我期待 os.fail() 在这种情况下返回 true,以便至少我可以捕获它(如 oreilly.com/library/view/c-cookbook/0596007612/ch03s06.html 所建议的那样),但这不会返回 true要么,所以这个错误逃脱了。有什么建议可以可靠地将电子表示法(不带小数点)转换为“int”,并且还可以可靠地捕获错误?
猜你喜欢
  • 2015-12-26
  • 2019-07-09
  • 2015-03-31
  • 2010-09-09
  • 1970-01-01
  • 2022-01-04
  • 2017-12-24
相关资源
最近更新 更多