字符串到双转换C ++

时间:2014-05-03 21:23:38

标签: c++ string double

我试图将一个字符串转换为一个双字符串,但我的双精度数在第三个小数点被截断。

我的字符串如下所示:" -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

我希望它保留所有小数点,任何提示?

3 个答案:

答案 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}}}),您只是打印不够的数字,使用doubleprecision通知setprecision要使用的数字位数,例如

cout

您需要cout << "Setting longitude: " << setprecision(15) << this->longitude << endl; 包含<iomanip>才能工作。