boost :: lexical_cast和双重奇怪的行为

时间:2015-02-06 13:00:39

标签: c++ boost

为什么以下代码在撰写"2.01""2.02"时会给出不同的结果?

#include <boost/lexical_cast.hpp>

#include <iostream>
#include <string>

int main()
{
  const std::string str = "2.02";

  try
  {
    const double b = boost::lexical_cast<double>(str) * 100.0;
    std::cout << "double: " << b << '\n';
    const int a = boost::lexical_cast<int>(b);
    std::cout << "int: " << a << '\n';
  }
  catch (const std::exception& ex)
  {
    std::cerr << ex.what() << '\n';
  }
}

输出

double: 202
int: 202

但如果我将"2.02"更改为"2.01",它会给我以下输出:

double: 201
bad lexical cast: source type value could not be interpreted as target

为什么?

我正在使用Visual Studio 2013(msvc-12.0)并提升1.57。

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是浮点不准确。

二进制浮点数中没有精确表示2.01,因此乘以100不会产生整数。

您可以将其显示为: Live On Coliru

std::cout << "double: " << std::setprecision(18) << std::fixed << b << '\n';

打印

double: 200.999999999999971578

由于这个原因,转换为int失败。