2016-04-22 3 views
0

Я использую C++ 11. У меня есть координаты реального мира, такие как 38.0098662, 23.7805398 в текстовом файле, что означает 2 double переменных. Я разбираю этот файл с C++ и конвертирую strings в double с помощью метода stod(). Когда я попытался напечатать значения с count.precision(9);, значения, казалось, были такими же, как в текстовом файле.Преобразование строки в двойную, а затем двойную в строку без потери точности

Затем, я хочу преобразовать эти значения double обратно в формат string. Для этого я использую метод to_string(). Однако это немного меняет стоимость. Например:

38.0098662, 23.7805398 became 
38.009866, 23.780540 
// in fact, every number is xx.yyyyyy 

Я не понимаю, почему это так сложно сделать с C++ 11. Почему я теряю точность без причины? Как я могу сделать это правильно? Каждый вопрос, на который я смотрел, указывал на метод to_string(), который я использую.

+0

_ «Я сделал то же самое в python, и я не видел этого поведения». _ Не уверен, что актуальность Python здесь. Это совсем другой язык. –

ответ

1

У кого-то была такая же проблема, как у вас. Просто установите точность std :: ostringstream в желаемый размер и верните его как std :: string.

Вот ссылка на старший вопрос, который показывает реализацию:

Look at this!

Надеется, что это помогает!

-3

Это связано с оптимизацией кода компилятора (для быстрого запуска). Иногда компилятор C++ оптимизирует обработку чисел с плавающей запятой и теряет небольшую точность.

+4

Это не имеет никакого отношения к оптимизации. В любом случае, как компилятор должен «оптимизировать» значение, считанное из файла во время выполнения? –

+0

https://msdn.microsoft.com/en-us/library/aa289157(v=vs.71).aspx –

+0

У gcc также есть оптимизация для модели с плавающей точкой. Эта оптимизация применяется, когда значение присваивается переменным. –

Смежные вопросы