Установите точность двойной переменной в 'string to double', используя лексическое приведение - PullRequest
0 голосов
/ 25 июня 2018

У меня есть строка, которая имеет значение "496934.079" . Я использую boost :: lexical_cast () , чтобы преобразовать это в двойную переменную (названную pVar ).

Однако значение, сохраненное в pVar после преобразования, равно "496934" , а не "496934.079" . Цифры после десятичной точки отсутствуют. Я прочитал о std :: setprecision () для записи двойного значения с необходимой точностью в окне вывода здесь . Но он отображает значение только с заданной точностью и не сохраняет его в переменной с заданной точностью.

Но я хочу сохранить двойное значение в точности так, как оно есть в строковой переменной str , чтобы значение в 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 Ответ

0 голосов
/ 25 июня 2018

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

EDIT

Обновленный код в вопросе показывает, что на самом деле для хранения значения используется float, а не double (ссылка * 1032).*pcl::PointXYZ).

A float не имеет достаточной точности для хранения полного значения 496934.079 - вместо этого он будет хранить наилучшее приближение (496934.09375), которое он может представить (например, В чем разница между float и double? ).

Если вы хотите сохранить полное значение (без изменений), обязательно придерживайтесь double.

...