我有一个字符串,值“496934.079”
我使用 boost::lexical_cast()将其转换为 double 变量(名为 pVar )。

但是,转换后存储在pVar中的值是“496934” 而不是“496934.079” 。小数点后的数字丢失。我已经读过有关 std::setprecision()的内容,该方法用于在输出窗口here中以所需的精度写入 double 值。但是它只显示给定精度的值,而不会以给定精度将其保存在变量中。

但是我想将 double 值完全存储在字符串变量 str 中,以便pVar中的值是“496934.079” 。如何以与输入字符串相同的精度将值存储在变量中,以便可以将变量用于进一步处理?

我的代码段是:

int func()
{
    string str = "496934.079";
    double pVar = boost::lexical_cast<double> (str);
    cout << pVar << endl;
    return 0;
}

编辑:这种从字符串到float的转换是我正在开发的代码的一部分,该代码逐行分析文本文件中的值并将它们写入另一个文件(.pcd格式)。我将添加用于此转换的全部代码以供引用。
int txt2pcd()
{
    ifstream is("input_text_file.txt");                                         //read input text file
    string str;
    using namespace boost::algorithm;
    pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
    while(getline(is, str))                                                     //parsing the text file contents line-by-line
    {
        std::string s = str.c_str();
        std::vector<std::string> result;
        std::istringstream iss(s);
        for(std::string s; iss >> s; )
            result.push_back(s);

        pcl::PointXYZ point;

        point.x = boost::lexical_cast<double> (result[0]);                      //string to float conversion for adding the X coordinate of the point
        point.y = boost::lexical_cast<double> (result[1]);                      //string to float conversion for adding the Y coordinate of the point
        point.z = boost::lexical_cast<double> (result[2]);                      //string to float conversion for adding the Z coordinate of the point

        point_cloud_ptr->points.push_back (point);
        point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
        point_cloud_ptr->height = 1;
    }
    pcl::io::savePCDFile ("output_pcd_file.pcd", *point_cloud_ptr, false);    //this is where the converted float values are stored (with digits altered after decimal point when compared to text file)
    return 0;
}

以下是文本文件中的几行示例以及转换后的“.pcd”文件中的相应行。

在文本文件中:

496934.999 5419547.239 265.179

496933.981 5419542.579 263.819

496934.891 5419545.399 264.849

496934.939 5419546.329 265.111

496934.829 5419544.489 264.781

在“.pcd”文件中(由boost::lexical_cast()产生的相应值)

496935 5419547 265.17899

496933.97 5419542.5 263.819

496934.91 5419545.5 264.849

496934.94 5419546.5 265.11099

496934.84 5419544.5 264.78101

请注意,这些值会四舍五入,或者在输出“.pcd”文件中更改小数点后的数字。这可能是什么原因?

最佳答案

boost::lexical_cast<double>(str) 已经返回完整值496934.079作为double。此完整值存储在pVar中,可用于进一步处理。

string str = "496934.079";
double pVar = boost::lexical_cast<double>(str); // pVar now contains 496934.079

std::setprecision 不会影响存储的值-它仅设置显示的数字位数(小数点之前和之后)。默认显示精度为6,因此:
std::cout << pVar << std::endl; // this prints "496934" (6 digits)

以更高的精度显示存储的值(例如10)可以得出:
#include <iomanip>

std::cout << std::setprecision(10) << pVar << std::endl; // this prints "496934.079"

但是重申一下:这些都不影响储值。 pVar仍然包含496934.079。例如 :
std::cout << (int) (pVar * 1000) << std::endl; // this displays 496934079

编辑

问题中更新的代码表明,实际上,float用于存储值,而不是double(引用 pcl::PointXYZ )。
float没有足够的精度来存储完整值496934.079-而是将存储它可以表示的最佳近似值(496934.09375)(例如What is the difference between float and double?)。

如果要确保可以保留完整值(未修改),请确保坚持使用double

09-25 20:25