我试图将一个字符串转换为一个双字符串,但我的双精度数在第三个小数点被截断。
我的字符串如下所示:" -122.39381636393" 转换后,它看起来像这样:-122.394
void setLongitude(string longitude){
this->longitude = (double)atof(longitude.c_str());
cout << "got longitude: " << longitude << endl;
cout << "setting longitude: " << this->longitude << endl;
}
输出示例:
got longitude: -122.39381636393
setting longitude: -122.394
我希望它保留所有小数点,任何提示?
答案 0 :(得分:4)
如果我是你,我会写这段代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "-122.39381636393";
std::cout.precision(20);
cout << "setting longitude: " << stod(str) << endl;
return 0;
}
基本上,你会改变:
打印精度
stod而不是低级操作,以从字符串中获得双重回复。
你可以看到它on ideone running。
答案 1 :(得分:3)
打印可能是截断精度,而不是从字符串到双精度的转换。
查看ios_base :: precision http://www.cplusplus.com/reference/ios/ios_base/precision/
e.g。
cout.precision(10);
cout << "setting longitude: " << this->longitude << endl;
答案 2 :(得分:2)
正确的C ++ 11解决方案是使用stod
- String TO Double。您可能应该在该函数周围使用try ... catch
,因为如果您的字符串不是有效数字,它会抛出异常。
但是,使用atof
的代码完全[假设您的特定标准C库中没有错误]转换为double
(尽管名称为Ascii TO Float,它返回{{ 1}}}),您只是打印不够的数字,使用double
或precision
通知setprecision
要使用的数字位数,例如
cout
您需要cout << "Setting longitude: " << setprecision(15) << this->longitude << endl;
包含<iomanip>
才能工作。