std::fixed, std::scientific, std::hexfloat, std::defaultfloat
来自cppreference.com
| 在标头 <ios> 定义
|
||
| |
(1) | |
| |
(2) | |
| |
(3) | (C++11 起) |
| |
(4) | (C++11 起) |
修改浮点数输出的默认格式化。
1) 如同以调用
str.setf(std::ios_base::fixed, std::ios_base::floatfield),设置流 str 的 floatfield 为 fixed。2) 如同以调用
str.setf(std::ios_base::scientific, std::ios_base::floatfield),设置流 str 的 floatfield 为 scientific。3) 如同以调用
str.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield),设置流 str 的 floatfield 同时为 fixed 和 scientific。这启用十六进制浮点数格式化。4) 如同以调用
str.unsetf(std::ios_base::floatfield),设置流 str 的 floatfield 为零,这与 fixed 和 scientific 不同。这是一个 I/O 操纵符,可用如 out << std::fixed 的表达式对任何 std::basic_ostream 类型的 out 或用如 in >> std::scientific 的表达式对任何 std::basic_istream 类型的 in 调用。
参数
| str | - | 到 I/O 流的引用 |
返回值
str(到操纵后的流的引用)。
注解
十六进制浮点数格式化忽略流精度规定,此为 std::num_put::do_put 的规定所要求。
这些操纵符不影响浮点数的分析。
示例
运行此代码
#include <iomanip>
#include <iostream>
#include <sstream>
enum class cap { title, middle, end };
void print(const char* text, double num, cap c)
{
if (c == cap::title)
std::cout <<
"┌──────────┬────────────┬──────────────────────────┐\n"
"│ number │ iomanip │ representation │\n"
"├──────────┼────────────┼──────────────────────────┤\n";
std::cout << std::left
<< "│ " << std::setw(8) << text << " │ fixed │ "
<< std::setw(24) << std::fixed << num << " │\n"
<< "│ " << std::setw(8) << text << " │ scientific │ "
<< std::setw(24) << std::scientific << num << " │\n"
<< "│ " << std::setw(8) << text << " │ hexfloat │ "
<< std::setw(24) << std::hexfloat << num << " │\n"
<< "│ " << std::setw(8) << text << " │ default │ "
<< std::setw(24) << std::defaultfloat << num << " │\n";
std::cout << (c != cap::end ?
"├──────────┼────────────┼──────────────────────────┤\n" :
"└──────────┴────────────┴──────────────────────────┘\n");
}
int main()
{
print("0.0", 0.0, cap::title);
print("0.01", 0.01, cap::middle);
print("0.00001", 0.00001, cap::end);
// 注意;选用 clang 以得到正确输出
double f;
std::istringstream("0x1.8p+0") >> f;
std::cout << "Parsing 0x1.8p+0 gives " << f << '\n';
std::istringstream("0x1P-1022") >> f;
std::cout << "Parsing 0x1P-1022 gives " << f << '\n';
}
输出:
┌──────────┬────────────┬──────────────────────────┐
│ number │ iomanip │ representation │
├──────────┼────────────┼──────────────────────────┤
│ 0.0 │ fixed │ 0.000000 │
│ 0.0 │ scientific │ 0.000000e+00 │
│ 0.0 │ hexfloat │ 0x0p+0 │
│ 0.0 │ default │ 0 │
├──────────┼────────────┼──────────────────────────┤
│ 0.01 │ fixed │ 0.010000 │
│ 0.01 │ scientific │ 1.000000e-02 │
│ 0.01 │ hexfloat │ 0x1.47ae147ae147bp-7 │
│ 0.01 │ default │ 0.01 │
├──────────┼────────────┼──────────────────────────┤
│ 0.00001 │ fixed │ 0.000010 │
│ 0.00001 │ scientific │ 1.000000e-05 │
│ 0.00001 │ hexfloat │ 0x1.4f8b588e368f1p-17 │
│ 0.00001 │ default │ 1e-05 │
└──────────┴────────────┴──────────────────────────┘
Parsing 0x1.8p+0 gives 1.5
Parsing 0x1P-1022 gives 2.22507e-308
参阅
| 更改浮点数精度 (函数) |