Установите точность двойной переменной в ‘string to double’, используя лексическое приведение

У меня есть строка, которая имеет значение «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». Что может быть причиной этого?

1

Решение

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,

6

Другие решения

Других решений пока нет …