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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With