精度输出

在默认的浮点表示法中,精度字段指定小数点前后显示的有意义数字的最大数量

std::fixed

std::fixed – 固定浮点表示法:它以定点表示法写入浮点值。该值的小数部分位数与精度字段(精度)指定的位数完全相同,并且没有指数部分。设置后如果不切换为其他模式,如std::senticific(它以科学点表示法写入浮点值。该值始终仅用小数点前一位数字表示,后跟小数点和与精度字段 (精度) 一样多的小数位数。最后,该表示法始终包含由字母“ e ”组成的指数部分,后跟可选符号和三个指数数字。)
double a = 4.342434245
std::cout<<std::fixed<<a
输出结果: 4.342424 (精度默认为6)

std::set_precision()

设置输出精度字段,设置一次即可,最大可设置为19

constexpr long double pi{std::numbers::pi_v<long double>};

1
2
for (int p(0); p <= max_precision; ++p)
std::cout << std::setw(2) << p << " " << std::setprecision(p) << pi << '\n';

输出结果:
precision: pi:
0 3
1 3
2 3.1
3 3.14
4 3.142
5 3.1416
6 3.14159
7 3.141593
8 3.1415927
9 3.14159265
10 3.141592654

std::setw()

更改且只更改下一个输入/输出字段的宽度。当在表达式 out << setw(n) 或 in >> setw(n) 中使用时,将流 out 或 in 的宽度参数精确设置为 n

应用到输出流

1
2
3
4
std::cout << "没有 setw:[" << 42 << "]\n"
<< "setw(6):[" << std::setw(6) << 42 << "]\n"
<< "setw(6),并输出多个元素:[" << 89 << std::setw(6) << 12 << 34 << "]\n";

输出结果:
没有 setw:[42]
setw(6):[ 42]
setw(6),并输出多个元素:[89 1234]

应用到输入流

1
2
3
std::istringstream is("hello, world");
char arr[10];
is >> std::setw(6) >> arr;

arr = “hello\0”

std::left

设置字符输出为左对齐

std::setfill(char c)

设置当字符串输出宽度达不到setw的值时的填充字符c

组合以上方法的实例

1
2
3
4
5
6
7
8
9
10
11
12
std::cout << std::fixed << std::setprecision(9) << std::left;
for (auto size{1ull}; size < 10'00'00'00'00ull; size *= 100)
{
const auto start = std::chrono::steady_clock::now();
do_some_work(size);
const auto end = std::chrono::steady_clock::now();

const std::chrono::duration<double> diff = end - start;

std::cout << "用于填充并迭代 " << std::setw(9)
<< size << " 个 int 的 vector 需要 : " << diff << '\n';
}

输出结果:

用于填充并迭代 1 个 int 的 vector 需要 : 0.000006568s
用于填充并迭代 100 个 int 的 vector 需要 : 0.000002854s
用于填充并迭代 10000 个 int 的 vector 需要 : 0.000116290s
用于填充并迭代 1000000 个 int 的 vector 需要 : 0.011742752s
用于填充并迭代 100000000 个 int 的 vector 需要 : 0.505534949s


精度输出
http://example.com/2023/12/07/精度输出/
作者
李凯华
发布于
2023年12月7日
许可协议