为什么以下代码在撰写"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。
提前致谢。
答案 0 :(得分:2)
这是浮点不准确。
二进制浮点数中没有精确表示2.01,因此乘以100不会产生整数。
您可以将其显示为: Live On Coliru
std::cout << "double: " << std::setprecision(18) << std::fixed << b << '\n';
打印
double: 200.999999999999971578
由于这个原因,转换为int失败。