将字符串转换为双精度浮点数——会丢失精度

5
我在将字符串转换为双精度浮点数时遇到了问题。我得到的字符串包含纬度/经度坐标,格式为33.9425/N 118.4081/W
我首先调用我的函数trimLastChar(std::string& input)两次,它将删除北、南、东、西字符,然后是斜杠。这个函数正确地返回33.9425118.4081作为std::string
我正在使用以下代码将我的std::string转换为double...但问题是,转换会丢失精度--我怀疑它被四舍五入了?
// Location In String is what trimLastChar returns
std::stringstream stream(locationInString);
std::cout << "DEBUG: before: " << locationInString << " ";
// output is a double* output = new double passed by reference to my function
stream >> output;
std::cout << output << std::endl;

在这种情况下输出会产生以下结果:
33.9425 
118.408

您可能已经注意到,正确的数值应该是118.4081,但其中的1缺失了... 你有什么想法可以修复它吗?或者更重要的是,为什么会出现这种情况呢?

2
你应该检查一下输出格式,我猜这只是cout的格式问题。 - IdeaHat
2个回答

7
输入时没有丢失精度,而是在输出时丢失了精度。
#include <iostream>
using std::cout;
using std::endl;
int main()
{
  double v = 118.4081;
  cout << v << endl;
  cout.precision(10);
  cout << v << endl;
}

输出:

$ g++ -Wall x.cpp && ./a.out
118.408
118.4081
$

3

您可能拥有比输出显示更多的数字。默认情况下,只显示少量数字,您需要使用std::setprecision来查看更多数字。试试

std::cout << std::setprecision(10) << output << std::endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接