2016-05-31 23 views
1

Я хочу читать поплавки и удваивать стандартный вход и сохранять его точность (точно такие же цифры после с плавающей запятой) и иметь возможность выводить (cout/printf) как есть. Какой самый удобный (и самый простой способ) сделать это? Спасибо!Сохранение float и двойной точности в C++ во время cin/cout и scanf/printf

+1

Поскольку float/double не являются бесконечной точностью, единственный способ сделать это надежно - прочитать его как строку и сохранить исходную строку вместе с преобразованным float/double. –

+0

Невозможно сделать. Причина очевидна - в stdin/stdout числа с плавающей запятой представлены в виде десятичных чисел (это требование стандартов). Стандарты C или C++ не определяют внутреннее представление чисел с плавающей запятой, поэтому невозможно написать переносное преобразование из строки в float/double и назад. Даже используемое де-факто стандартное представление чисел не допускает десятичных двоичных обратимых преобразований в общем случае. Для иллюстрации: попробуйте преобразовать 1/3 в десятичную нотацию и обратно, сохраняя точность. –

ответ

0
float f; 
cin >> f; 
cout << f; 
+0

Но с двойным 12345.56789 такой же aproach не работает. double d; cin >> d; cout << d; –

0

setprecision.

Вот решение

cout<<setprecision(the precision you want to set here)<<variablename; 

например. Если вы хотите установить точность выходного сигнала 5 для переменной var использовать его как это:

cout<<setprecision(5)<<var; 

setprecision является манипулятором. Узнайте больше об манипуляторах here.

Он устанавливает десятичную точность, которые будут использоваться для значений с плавающей запятой

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

Это манипулятором и объявлен в заголовке <iomanip>

0

Поскольку вход имеет неизвестную точность, самый простой способ, чтобы читать их в виде строк, а не удваивается/поплавки.

Если вам нужно значение float, требуется простая строка для двойного преобразования.

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

Последний не может различать 0,4 и 0,40.