2014-11-18 10 views
-1

Мне нужен способ преобразования этой строки в ее точное числовое представление. Я пробовал немало вещей, и, как я знаю, это должно работать (знаменитые последние слова). Я стараюсь держаться подальше от установки библиотек, и у меня есть много этих чисел для преобразования.Прецизионность при преобразовании десятичного числа строки

Я понимаю, что трудно представить длинные десятичные числа в двоичном формате, но мне нужно решение.

#include <iostream> 
#include <stdlib.h> 

using namespace std; 

int main() 
{ 
    string data = "138.6470184568"; 
    cout << atof(data.c_str()) << endl; 

    return 0; 
} 

Выход

138.647 
+0

Что вы собираетесь делать с ними после преобразования? Вы используете GCC? Похоже, что у него есть некоторая поддержка десятичной суммы, встроенная без библиотеки - http://stackoverflow.com/questions/14096026/c-decimal-data-types#comment19516201_14096071 – TessellatingHeckler

+0

Значение может храниться точно в двоичном виде или нет. t зависит от длины в десятичной форме, но может ли она быть представлена ​​диадической фракцией или нет. Например, 0,1 не может быть правильно отображен в двоичном формате, хотя он очень короткий, но 0.000244140625 может –

+0

и ** не использовать ** atof', а также 'atoi'. Это небезопасно. Используйте ['strtod'] (http://en.cppreference.com/w/cpp/string/byte/strtof), потому что он обеспечивает проверку ошибок –

ответ

0

Оказывается, что это преобразование корректно, но, когда его попросили COUT число, оно дает только 3-4 знака после запятой. Кто-нибудь знает, почему?

#include <iostream> 
#include <stdlib.h> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    string data1 = "138.6470184568"; 
    string data2 = "138.6470184568"; 
    double data3 = atof(data1.c_str()) + atof(data2.c_str()); 

    cout << data3 << endl; 
    cout << setprecision(15) << data3; 

    return 0; 
} 

дает

277.294 
277.2940369136 
+0

Если вы хотите получить ответы на интересующий вас вопрос, не могли бы вы создать новый вопрос? –

+0

Как это ответить на ваш вопрос? [Точность по умолчанию - 6 цифр] (http://en.cppreference.com/w/cpp/io/ios_base/precision), и 277.294 и 138.647 имеют 6 значащих цифр –

+0

Вы правы, но мне нужно было сделать арифметика с номерами большей точности. Мой ответ выше доказывает, что, хотя по умолчанию он будет составлять всего 6 цифр, он сохраняет (и, следовательно, выполняет арифметику) все число, в которое я прошел. –