简体   繁体   中英

boost::lexical_cast and double — strange behavior

Why does the following code gives me the different results when I write "2.01" and "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';
  }
}

Output

double: 202
int: 202

But if I change "2.02" to the "2.01" it gives me the following output:

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

Why?

I'm using Visual Studio 2013 (msvc-12.0) and boost 1.57.

Thanks in advance.

It's floating point inaccuracy.

There's no exact representation of 2.01 in binary floating point so, multiplying by 100 doesn't result in an integer number.

You can make it visible: Live On Coliru

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

Prints

double: 200.999999999999971578

Conversion to int fails for this reason.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM