【问题标题】:boost lexical cast string to double将 lexical_cast 字符串提升为双倍
【发布时间】:2013-08-06 08:25:09
【问题描述】:

我遇到了转换问题,希望得到您的帮助。我正在使用 gcc4 编译器,但我只能使用 gcc4。

我想将 std::string 转换为双精度。

std::string aQuantity = aRate.getQuantity();
std::string aAmount = aRate.getAmount(); 

// aAmount = "22.05"

double dQuantity = boost::lexical_cast<double>(aQuantity);
double dAmount = boost::lexical_cast<double> (aAmount);

// dAmount =  22.050000000000001

顺便说一句,我也试过atof,但我仍然遇到同样的问题。有什么方法可以使用istringstreamsetprecission(2) 来获得aAmount 显示的正确值?

【问题讨论】:

  • 您只需要以较低的精度打印它。它始终存储相同的精度。
  • boost::lexical_cast 函数实际上在内部使用std::istringstream 来进行值的解析/提取。
  • 如果我执行以下操作,我会得到 22 个...std::stringstream precisionValue; precisionValue.precision(2); precisionValue &lt;&lt; boost::lexical_cast&lt;double&gt; (aAmount) &lt;&lt; std::endl; double dAmount; precisionValue &gt;&gt; dAmount; // Now I get 22
  • precision 设置输出的总位数。 22.05 是 4 位数,所以你需要做 precisionValue.precision(4)

标签: c++ lexical-cast atof


【解决方案1】:

由于浮点值的性质,22.050000000000001 是可以存储的最接近 22.05 的值。如果您只是尝试将 22.05 存储在 double 中然后打印它,也会发生同样的情况。

如果要打印 22.05,则应在输出流上设置精度。或者,您可以研究一个有理数库(例如,Boost.Rational)。这将能够精确地存储值 22.05,这与双精度(或浮点)不同。

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多