В самом деле, что является противоположностью «исправлено» Манипулятор ввода / вывода?

Это может быть дубликатом этот вопрос, но я не чувствую, что на самом деле ответили правильно. Заметим:

#include <iostream>
#include <iomanip>
using namespace std;
int main () {
float p = 1.00;
cout << showpoint << setprecision(3) << p << endl;
}

Выход: 1.00

Теперь, если мы изменим эту строку на:

  cout << fixed << showpoint << setprecision(3) << p << endl;

мы получаем: 1.000

И если мы используем «противоположность» фиксированного, мы получаем что-то совершенно другое:

  cout << scientific << showpoint << setprecision(3) << p << endl;

Выход: 1.000e+00

Как я могу вернуться к поведению первой версии после fixed был установлен?

4

Решение

Спецификация формата для чисел с плавающей запятой является вызовом битовой маски std::ios_base::floatfield, В C ++ 03 он имеет две названные настройки (std::ios_base::fixed а также std::ios_base::scientific). По умолчанию ни один из этих флагов не установлен. Это может быть достигнуто, например, с помощью

stream.setf(std::ios_base::fmtflags(), std::ios_base::floatfield);

или же

stream.unsetf(std::ios_base::floatfield);

(тип поля std::ios_base::fmtflags).

С текущим C ++ есть также std::ios_base::hexfloat и добавлены два манипулятора, в частности, std::defaultfloat() который очищает std::ios_base::floatfield:

stream << std::defaultfloat;
6

Другие решения

Я думаю, что ответ std::defaultfloat, Однако это доступно только в C ++ 11. Увидеть http://en.cppreference.com/w/cpp/io/manip/fixed.

3

До C ++ 11 вы можете очистить fixed флаг, но не с помощью манипулятора:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float p = 1.00;
cout << showpoint << fixed << setprecision(3) << p << endl;

// change back to default:
cout.setf(0, ios::fixed);
cout << showpoint << setprecision(3) << p << endl;
}
0
По вопросам рекламы [email protected]