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.