5

我无法将字符串转换为双精度。我得到一个带有纬度/经度坐标的字符串,格式为33.9425/N 118.4081/W

我首先调用我的函数trimLastChar(std::string& input)两次,这将删除北、南、东、西字符,然后是正斜杠。此函数正确返回33.9425118.4081恭敬地作为std::string.

我正在使用以下代码将我的转换std::stringdouble...但是问题是,转换会损失精度——我怀疑它会被四舍五入?

// 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...

任何想法如何解决?或者更重要的是,为什么会发生这种情况?

4

2 回答 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
$
于 2013-10-18T20:41:46.523 回答
3

您的数字可能比输出显示的多。默认只显示少量数字,您需要使用std::setprecision才能看到更多数字。尝试

std::cout << std::setprecision(10) << output << std::endl;
于 2013-10-18T20:40:59.157 回答