将字符串转换为双精度 - 失去精度

时间:2013-10-18 20:34:37

标签: c++ string double

我在将字符串转换为double时遇到问题。我得到一个带有纬度/长坐标的字符串,格式为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 个答案:

答案 0 :(得分: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
$

答案 1 :(得分:3)

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

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