На этом шаге мы рассмотрим различные способы вывода вещественных чисел.
Некоторые флаги и переменные управляют выводом вещественных чисел. Флаги, перечисленные в таблице 1, определяют тип записи (десятичная или научная). Эти флаги определяются в классе ios_base вместе с соответствующей маской. Если флаг ios::fixed устаиовлен, вещественные числа выводятся в десятичной записи. При установке флага ios::scientific используется научная (экспоненциальная) запись.
Маска | Флаг | Описание |
---|---|---|
floatfield | fixed | Использование десятичной записи |
scientific | Использование научной записи | |
нет | Использование "лучшей" из этих двух записей |
Точность вывода определяется функцией precision() (таблица 2).
Функция | Описание |
---|---|
precision() | Возвращает текущую точность вывода вещественных чисел |
precision(val) | Определяет новую точность вывода вещественных чисел val и возвращает прежнюю точность |
При использовании научной записи функция precision() определяет количество десятичных разрядов в дробной части. Остаток всегда округляется.
Вызов precision() без аргументов возвращает текущую точность. При вызове с аргументом функция precision() устанавливает заданную точность вывода и возвращает предыдущую точность. По умолчанию точность равна шести десятичным цифрам.
По умолчанию ни один из флагов ios::fixed и ios::scientific не устанавливается. В этом случае запись выбирается в зависимости от выводимого значения. Для этого делается попытка вывести все значащие десятичные цифры (но не более precision()) с удалением начального нуля перед десятичной точкой и/или всех завершающих пробелов, а в крайнем случае - даже десятичной точки. Если precision() разрядов оказывается достаточно, используется десятичная запись; в противном случае - научная запись.
При помощи флага showpoint можно заставить поток данных выводить десятичную точку и завершающие нули до ширины precision() разрядов (таблица 3).
Флаг | Описание |
---|---|
showpoint | Десятичная точка всегда используется при выводе |
Таблица 4 иллюстрирует довольно сложные взаимосвязи между флагами и точностью на примере двух конкретных чисел.
precision() | 421.0 | 0.0123456789 | |
---|---|---|---|
Обычный формат | 2 | 4.2е+02 | 0.012 |
6 | 421 | 0.0123457 | |
С флагом showpoint | 2 | 4.2е+02 | 0.012 |
6 | 421.000 | 0.0123457 | |
С флагом fixed | 2 | 421.00 | 0.01 |
6 | 421.000000 | 0.012346 | |
С флагом scientific | 2 | 4.21е+02 | 1.23е-02 |
6 | 4.210000е+02 | 1.234568е-02 |
Как и в случае целых значений, флаг ios::showpos служит для принудительного вывода знака положительных чисел. Флаг ios::uppercase указывает, какая буква должна использоваться в научной записи (Е или е).
Флаг ios::showpoint, тип записи и точность можно задать при помощи манипуляторов, представленных в таблице 5.
Манипулятор | Описание |
---|---|
showpoint | Десятичная точка всегда используется при выводе (установка флага ios::showpoint) |
noshowpoint | Десятичная точка не обязательна при выводе (сброс флага ios::showpoint) |
setprecision(val) | Выбор новой точности val |
fixed | Использование десятичной записи |
scientific | Использование научной записи |
Например, рассмотрим такую команду:
std::cout << std::scientific << std::showpoint << std::setprecision(8) << 0.123456789 < std::endl;
Эта команда выводит следующий результат:
1.23456789е-01
Манипулятору setprecision() передается аргумент, поэтому для его использования необходимо включить в программу заголовочный файл <iomanip>.
На следующем шаге мы рассмотрим общие параметры форматирования.