Форматирование поплавков: возврат к стандартному - PullRequest
0 голосов
/ 28 октября 2018

Я сталкиваюсь с проблемой форматирования значений с плавающей запятой в смысле возврата к «форматированию по умолчанию».Скажем, у меня есть 2 числа с плавающей точкой:

float f1 = 3.0f, f2 = 1.5f;
std::cout << f1 << " - " << f2 << "\n";

покажет их как: 3 - 1.5

Теперь по какой-то причине мне нужно установить точность на std::cout (для другой печати):

cout << std::precision(2);

Если я снова напечатаю два моих поплавка, это приведет к: 3.00 - 1.50

Теперь я хочу вернуться к форматированию по умолчанию.До C ++ 11 это кажется трудным (или это было?).Но, спасибо, я теперь получил этот новый флаг: std :: defaultfloat .Давайте попробуем:

std::cout << std::defaultfloat << f1 << " - " << f2;

напечатает: 3 - 1.50.Хорошо.

О, но подождите .Скажем, у меня вместо этого:

float f1 = 444.0f, f2 = 444.5f;

Печать по умолчанию покажет: 444 - 444.5

Точность установки (и «фиксированная»):

cout << std::precision(2) << std::fixed;

покажет: 444.00 - 444.50

Но при возврате к «по умолчанию»:

std::cout << std::defaultfloat << f1 << " - " << f2;

выведет: 4.4e+02 - 4.4e+02 (автоматическое переключение на научный формат).И, если вам интересно, добавление «фиксированного» флага сохранит ранее назначенную точность, таким образом, не вернувшись к исходным настройкам.

Вопрос : Как вернуться к значениям по умолчанию?mode?

FWIW, живой код здесь .

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

Редактировать 2 : по запросу приведен полный код, демонстрирующий проблему:

int main()
{
    float f1 = 444.5f, f2=443.0f;
    std::cout << f1 << " - " << f2 << "\n";
    std::cout << std::fixed << std::setprecision(2);
    std::cout << f1 << " - " << f2 << "\n";
    std::cout << std::defaultfloat;
    std::cout << f1 << " - " << f2 << "\n";
}

И результат:

444.5 - 443
444.50 - 443.00
4.4e+02 - 4.4e+02

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

std::defaultfloat не сбрасывает точность.(Не спрашивай меня почему).Вы можете сбросить его на значение по умолчанию, которое определяется как 6:

std::cout << std::defaultfloat << std::setprecision(6) << f1 << " - " << f2;

В качестве альтернативы вы можете сохранить все состояние потока до операции и восстановить его после;см. эту тему .

0 голосов
/ 28 октября 2018

std :: precision указывает точность отображения cout, она не изменяется при изменении форматирования.

Поэтому, когда вы устанавливаете std :: precision (2), он указывает, что все последующие форматы будутотображение с примененной точностью.

Фиксированный формат применяет точность, поскольку n - это число знаков после десятичной точки.Формат defaultfloat применяет точность как максимальное количество отображаемых цифр.

НЕ сбрасывает значение точности.

Для справки: ios_base :: precision

...