我有一个字符串,其值为“ 496934.079” 。 我使用 boost :: lexical_cast()将其转换为双精度变量(名为 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”文件中更改小数点后的数字。可能是什么原因?
答案 0 :(得分:6)
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
)(例如{{ 3}})。
如果您想确保可以保留全部价值(未修改),请务必坚持使用double
。