У меня есть строка, которая имеет значение «496934.079» .
я использую boost :: lexical_cast () чтобы преобразовать это в двойную переменную PVAR).
Однако значение, сохраненное в pVar после преобразования «496934» не «496934.079». Цифры после десятичной точки отсутствуют. Я читал о станд :: setprecision () для записи двойного значения с необходимой точностью в окне вывода Вот. Но он отображает значение только с заданной точностью и не сохраняет его в переменной с заданной точностью.
Но я хочу сохранить двойное значение точно так же, как в строковой переменной ул так что значение в pVar «496934.079». Как я могу сохранить значение в переменной с той же точностью, что и во входной строке, чтобы я мог использовать переменную для дальнейшей обработки?
Мой фрагмент кода:
int func()
{
string str = "496934.079";
double pVar = boost::lexical_cast<double> (str);
cout << pVar << endl;
return 0;
}
РЕДАКТИРОВАТЬ: Это преобразование из строки в число с плавающей запятой является частью разрабатываемого мной кода, который разбирает значения из текстового файла построчно и записывает их в другой файл (формат .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
) он может представлять (например, В чем разница между float и double?).
Если вы хотите сохранить полную стоимость (без изменений), обязательно придерживайтесь double
,
Других решений пока нет …