Шаг 490.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Стандартные функции ввода-вывода. Форматирование. Формат вещественных чисел

    На этом шаге мы рассмотрим различные способы вывода вещественных чисел.

    Некоторые флаги и переменные управляют выводом вещественных чисел. Флаги, перечисленные в таблице 1, определяют тип записи (десятичная или научная). Эти флаги определяются в классе ios_base вместе с соответствующей маской. Если флаг ios::fixed устаиовлен, вещественные числа выводятся в десятичной записи. При установке флага ios::scientific используется научная (экспоненциальная) запись.

Таблица 1. Флаги вывода вещественных чисел
Маска Флаг Описание
floatfield fixed Использование десятичной записи
scientific Использование научной записи
нет Использование "лучшей" из этих двух записей

    Точность вывода определяется функцией precision() (таблица 2).

Таблица 2. Функции управления точностью вывода вещественных чисел
Функция Описание
precision() Возвращает текущую точность вывода вещественных чисел
precision(val) Определяет новую точность вывода вещественных чисел val и возвращает прежнюю точность

    При использовании научной записи функция precision() определяет количество десятичных разрядов в дробной части. Остаток всегда округляется.

    Вызов precision() без аргументов возвращает текущую точность. При вызове с аргументом функция precision() устанавливает заданную точность вывода и возвращает предыдущую точность. По умолчанию точность равна шести десятичным цифрам.

    По умолчанию ни один из флагов ios::fixed и ios::scientific не устанавливается. В этом случае запись выбирается в зависимости от выводимого значения. Для этого делается попытка вывести все значащие десятичные цифры (но не более precision()) с удалением начального нуля перед десятичной точкой и/или всех завершающих пробелов, а в крайнем случае - даже десятичной точки. Если precision() разрядов оказывается достаточно, используется десятичная запись; в противном случае - научная запись.

    При помощи флага showpoint можно заставить поток данных выводить десятичную точку и завершающие нули до ширины precision() разрядов (таблица 3).

Таблица 3. Фпаг обязательного вывода десятичной точки
Флаг Описание
showpoint Десятичная точка всегда используется при выводе

    Таблица 4 иллюстрирует довольно сложные взаимосвязи между флагами и точностью на примере двух конкретных чисел.

Таблица 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.

Таблица 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>.

    На следующем шаге мы рассмотрим общие параметры форматирования.




Предыдущий шаг Содержание Следующий шаг