2016-03-03 3 views
1

Так что я знаю, что setprecision(int n) следует использовать при печати двойного значения с точностью n. Тем не менее, я столкнулся с проблемой на проекте, который я работаю на том, что сродни этот код:Потеря точности при преобразовании двойного в строку в C++

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() { 
    double var = 1.0000001; 
    cout << setprecision(10)<< var << endl; 
    string str = to_string(var); 
    cout << str << endl; 
    return 0; 
} 

Здесь выход:

1.0000001 
1.000000 

В проекте я нахожусь работая, мне нужно сохранить двойное значение как строку, и ему иногда понадобится более шести десятичных знаков точности. Здесь точность явно теряется при преобразовании. Любые указатели будут очень благодарны.

+1

Возможный дубликат [Точность std :: to \ _string (double)] (http://stackoverflow.com/questions/14520309/the-precision-of-stdto-stringdouble) – Barmar

+2

Вместо этого используйте 'stringstream' of 'to_string', поэтому вы можете использовать параметры форматирования. – Barmar

+0

Два указателя: 1) 'int * p', 2) не следует использовать' std :: to_string', если вам нужно управлять точностью. – AnT

ответ

3

Вы можете использовать std::stringstream.

#include <iostream> 
#include <sstream> 
#include <iomanip> 
using namespace std; 

int main(void) { 
    double var = 1.0000001; 
    cout << setprecision(10)<< var << endl; 
    stringstream ss; 
    ss << setprecision(10) << var; 
    string str; 
    ss >> str; 
    cout << str << endl; 
    return 0; 
} 
+0

Awesome. Большое спасибо. – user3154754

+0

BTW в VS2015 этот вызов переводится в строку форматирования, подобную этой ' sprintf_s ("%. * g", 10, var) '. Это было полезно для меня. –

0

попробовать это:

#include <sstream> 
#include <string> 

// In some function: 
double d = 453.23; 
std::ostringstream os; 
os << d; 
std::string str = os.str(); 
+0

Спасибо. Это тоже хорошо. – user3154754

0

Если вы хотите, чтобы получить полную точность от своего двойника, не ограничивая его конкретное значение (подразумеваемого ваш «иногда нужно больше, чем шесть знаков после запятой»), и если вы используете Повысьте эффективность библиотеки, вы также можете попробовать эту следующую альтернативу:

#include <boost/lexical_cast.hpp>  
#include <iostream> 

using namespace boost; 
using namespace std;  

int main() { 
    double var = 1.0000001; 
    cout << lexical_cast<string>(var) << endl; 
    return 0; 
} 

Это оказалось полезным в одном из моих приложений, где точность имела значение, а подход std::stringstream был не очень удобным и изящным из-за использования некоторых специальных оберток функций регистрации. Вы можете найти больше информации о boost::lexical_cast и о том, как это касается внутренних представлений here.

Очевидно, что если вы не используете Boost в своем проекте, этот подход overkill.

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