Это может быть дубликатом этот вопрос, но я не чувствую, что на самом деле ответили правильно. Заметим:
#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
был установлен?
Спецификация формата для чисел с плавающей запятой является вызовом битовой маски 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;
Я думаю, что ответ std::defaultfloat
, Однако это доступно только в C ++ 11. Увидеть http://en.cppreference.com/w/cpp/io/manip/fixed.
До 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;
}