Как сделать точность вывода с
Один из основных механизмов, который делает программу полезной является ввод/вывод. Все языки программирования имеют такой механизм. Среди операторов и ключевых слов нет ввода/вывода. Потому что в языке С++ ввод/вывод реализован в виде библиотеки. И вообще многие механизмы, которые делают язык С++ таким мощным реализованы в библиотеках (стандартные, специализированные, персональные).
В С++ используется механизм потокового ввода/вывода. Поток - механизм преобразования значений различного типа в последовательность символов (вывод) и наоборот (ввод), в значение переменной.
Вывод: Помещение (направление) данных в поток вывода осуществляется с помощью оператора cout '
flush; // очистка буфера потока
Это лишь основные манипуляторы, которые вы можете использовать для форматирования. С остальными познакомьтесь самостоятельно:
Манипулятор | Действие на поток |
---|---|
showbase noshowbase | инициирует отображение основания системы счисления |
showpos noshowpos | инициирует явное отображение знака (+) для положительных значений |
uppercase nouppercase | инициирует преобразование выводимых символов в верхний регистр |
showpoint noshowpoint | инициирует отображение десятичной точки при выводе вещественных чисел |
skipws noskipws | инициирует пропуск пробельных символов при вводе |
left | инициирует левое выравнивание, заполнение справа |
right | инициирует правое выравнивание, заполнение слева |
internal | инициирует внутреннее заполнение (между значением и знаком или основанием системы счисления) |
scientific | инициирует вывод вещественных значений в научном формате (d.ddddddddE+dd) |
fixed | инициирует вывод вещественных значений в фиксированном формате (d.dddddd) |
setbase (int base) | изменяет систему счисления (10, 8, 16) |
dec | инициирует вывод целочисленных значений в десятичной системе счисления |
oct | инициирует вывод целочисленных значений в восьмеричной системе счисления |
hex | инициирует вывод целочисленных значений в шестнадцатеричной системе счисления |
setfill (char n) | задает заполняющий символ |
setprecision (int n) | изменяет точность выводимых значений |
setw (int n) | задает ширину поля вывода |
Файловые потоки
Для первых программ стандартных потоков ввода/вывода будет достаточно, но по мере усложнения программ не обойтись без работы с файлом, которая в С++ осуществляется так же на основе механизма потоков.
void main()
ifstream inputfile("z:\data.txt"); // создается поток ввода из файла
inputfile>>x; // все то же самое что и для cin
ofstream outputfile("z:\res.txt"); // создается поток вывода в файл
outputfile
Обратите внимание на двойной слэш \ в имени файла. Это все из-за того, что \ - экранирующий символ.
По умолчанию ввод и вывод данных в поток осуществляется в текстовом режиме. Для того, чтобы данные выводились в двоичном режиме следует использовать следующую запись:
По умолчанию файл открываемый для вывода создается (если он создан), а если существует, то очищается. Для того чтобы открыть файл для добавления:
Я хочу глобально установить точность выходного сигнала до 2 десятичных знаков.
Я уже пытался использовать iomanip а также setprecision Тем не менее, я продолжаю получать вывод с ‘е’ в нем.
Это мой пример кода:
Решение
Другие решения
Вы можете использовать что-то вроде этого:
Вам нужно будет включить iomanip, чтобы это работало.
Если ваш e является положительным значением, вы не можете использовать их, потому что ваше значение слишком велико. Этот код
Если это отрицательное число, вашей точности недостаточно. Как следующий код
Простым способом будет использование std :: fixed
Но недостаток, который вы испытываете при использовании std :: fixed, заключается в том, что он показывает ноль после последнего ненулевого числа до тех пор, пока не достигнет установленной ранее величины preprecy.
Чтобы, например, указать ширину полей, левое или правое выравнивание и т.д. можно использовать printf(), а можно сделать то же самое при помощи средств форматирования ввода/вывода языка С++. Существуют два способа форматирования ввода/вывода, которые мы по очереди рассмотрим в данной главе.
Первый способ предусматривает использование функций для установки определенных флагов форматирования, которые перечислены в классе ios_base
Рассмотрим что делают перечисленные выше флаги.
Флаг | Описание |
skipws | Следующие в начале символы-разделители (пробелы, символы табуляции и новой строки) при выполнении ввода отбрасываются. |
left | Осуществляется ввод с левым выравниванием |
right | Осуществляется ввод с правым выравниванием (по умолчанию) |
internal | Знак или префикс системы счисления выравнивает слева, число выравнивает справа |
dec | Численные значения выводятся в десятичной форме (по умолчанию) |
oct | Численные значения выводятся в восьмеричной форме |
hex | Численные значения выводятся в шестнадцатиричной форме |
showbase | Позволяет при выводе указывать числовую базу (десятичную, восьмеричную, шестнадцатиричную) |
showpoint | Приводит к выводу десятичной запятой и нулей справа для всех чисел с плавающей запятой вне зависимости, нужно это или нет |
uppercase | При выводе чисел с плавающей точкой при использовании экспоненциальной формы выводится большая буква E. Также при выводе чисел в шестнадцатиричной форме символ 'x' выводится в верхнем регистре. |
showpos | Приводит к тому, что перед положительным числом будет выводится знак "+" |
scientific | Числа с плавающей запятой выводятся с использованием научной нотации |
fixed | Числа с плавающей запятой выводятся в нормальной нотации |
unitbuf | При каждой операции вставки вывода данные немедленно заносится в поток |
Что делают флаги мы рассмотрели. Теперь необходимо познакомиться с функциями, которые устанавливают и сбрасывают эти флаги.
Первая функция, которую мы рассмотрим, - это функция setf(), используемая для установки флагов
Функция принимает в качестве параметра рассмотренные выше флаг или флаги, соединенные между собой при помощи побитового ИЛИ. Она возвращает предыдущее значение флага. Рассмотрим пример:
Для отключения установленных флагов нужно использовать функцию unsetf(). Она имеет следующий прототип:
Функция возвращает значение предыдущей установки флага и сбрасывает флаги, определяемые параметром flags. Пример:
Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после десятичной запятой. Для этого используются следующие функции:
Функция width() устанавливает ширину поля и возвращает текущую ширину. Вторая функция - fill() устанавливает текущий символ заполнения и возвращает предыдущий символ заполнения. По умолчанию используется пробел. А функция precision устанавливает точность чисел с плавающей точкой. В научном режиме эта функция определяет количество цифр после десятичной запятой. В обычной нотации функция обозначает количество выводимых цифр. Точность, установленная по умолчанию, равна 6. Функция width() воздействует только на один вывод информации, а после этого в действие вступают параметры принятые по умолчанию. В случае с остальными двумя функциями новые установки остаются действовать до их явного обновления. Приведем пример:
А теперь мы переходим к рассмотрению второго способа форматирования ввода/вывода. Второй способ - это использование манипуляторов.
статьи
Начнем!
Цифры после точки
Цифры перед точкой
Если на выходе нужно получить строку, в которой число знаков перед точкой будет не менее заданного числа, используйте шаблон, в котором указывается столько нулей перед точкой, сколько символов должно быть минимально.
Разделитель тысяч
Ведущие Нули
Вещественные числа, не превосходящие единицы по абсолютному значению, можно форматировать двумя способами:
- с ведущими нулями
- без ведущих нулей
Случай с ведущими нулями — самый обычный. Для него используются те же шаблоны, что описаны выше.
Выравнивание с помощью пробелов
Для выравнивания числа по правому краю используется запятая перед двоеточием. То есть, ставится запятая, а следом идет число, которое указывает, сколько пробелов должно быть. Пример: «0,10:0.0″.
Для выравнивания по левому краю, шаблон будет таким же, за исключением того, что число пробелов должно быть указано со знаком минуса.
P.S. Этот способ можно использовать только с помощью метода String.Format
Пользовательское форматирование отрицательных чисел и нулей
Если Вам необходимо получить строки в своем стиле форматирования, используйте точку с запятой для разделения шаблона на три части. Первая часть отвечает за форматирование положительных чисел, вторая — отрицательных, третья — нулей. Если Вы пропустите последнюю часть, то нули будут отформатированы так же, как и положительные числа.
Некоторые забавные примеры
Как Вы могли заметить в предыдущем примере, Вы можете вставить любой текст в шаблон, например, «my text 0.0″. Вы даже можете вставить текст между нулями: «0aaa.bbb0″.
Небольшое мое дополнение к статье
В зависимости от локали (языкового стандарта программы), выводимые символы могут отличаться. Например, вместо точек выводятся запятые и т.д. К слову, у меня вместо десятичной точки выводится запятая, а вместо тысячного разделителя — пробел.
Читайте также: