C++格式化输出和精度控制

C++格式化输出和精度控制

setw()

cout 提供了一种指定每个号码使用的最小空格数量的方法。流操作符 setw 可用于建立指定宽度的打印区域。以下是其用法示例:

int main()
{
    int value = 23;
    cout << setw(5) << value;
}

单词 setw 后面括号内的数字表示紧随其后的值的字段宽度。字段宽度是屏幕上打印值的字符位置或空格的最小数量。在此示例中,数字 23 将显示在 5 个空格的字段中。

为了进一步解释其工作原理,请看以下语句:

int main()
{
    int value = 23;
    cout << "(" << setw(5) << value << ")";
}

输出结果:

(   23)

请注意,这个数字占据了字段的最后两个位置。由于这个数字没有使用整个字段,所以 cout 用空格填充了额外的 3 个位置。因为这个数字出现在字段的右侧,空格“填充”在前面,所以它被认为是右对齐的。

默认是右对齐的,std::right

如果要左对齐输出,只需要插入 std::left

#include <bits/stdc++.h>
using namespace std;
int main()

{
  int value1 = 123;
  int value2 = 12;
  int value3 = 1;

  cout << setw(5) << value1 << "\n";
  cout << setw(5) << value2 << "\n";
  cout << setw(5) << value3 << "\n";
  
  cout << left << setw(5) << value1 << "\n";
  cout << left << setw(5) << value2 << "\n";
  cout << left << setw(5) << value3 << "\n";
}

输出结果:

  123
   12
    1
123  
12   
1   

请注意,setw 操作符要与每个值一起使用,这是因为 setw **只为紧随其后的值建立一个字段宽度。**打印该值后,cout 将回到其默认的打印方式。如果数字太大导致字段无法完全容纳,那会怎么祥呢?如下列语句所示:

int main()
{
    int value = 12345;
    cout << "(" << setw(2) << value << ")";
}

输出结果:

(12345)

在这种情况下,cout 将打印整个数字,因为 setw **只指定了打印字段中最少的位置数。**任何需要比指定最小值大的字段的数字将导致 cout 覆盖 setw 值。

  • 浮点数的字段宽度包括小数点的位置。
  • 字符串的字段宽度包括字符串中的所有字符,包括空格。
  • 默认情况下,该字段中打印的值为右对齐。这意味着它与打印字段的右侧对齐,并且必要时在值前填充空格。

setfill()

声明setfill (char_type c);

setw() 默认填充的内容为空格,可以 setfill()配合使用设置其他字符填充。

#include <bits/stdc++.h>
using namespace std;
int main()

{
  int value1 = 123;
  int value2 = 12;
  int value3 = 1;

  cout << setfill('@') << setw(5) << value1 << "\n";
  cout << setfill('#') << setw(5) << value2 << "\n";
  cout << setfill('*') << setw(5) << value3 << "\n";
}

输出结果:

@@123
###12
****1

setprecision()

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double value = 123.456;
    cout<<value<<endl;
    cout<<setprecision(7)<<value<<endl;
    cout<<setprecision(6)<<value<<endl;
    cout<<setprecision(5)<<value<<endl;
    cout<<setprecision(4)<<value<<endl;
    cout<<setprecision(3)<<value<<endl;
    cout<<setprecision(2)<<value<<endl;
    cout<<setprecision(1)<<value<<endl;
}

输出结果:

123.456
123.456
123.456
123.46
123.5
123
1.2e+02
1e+02

请注意,与 setw 不同的是,setprecision 不计算小数点。例如,当使用 setprecision(6) 时,输出包含 5 位有效数,但是需要 7 个位置来显示 123.456

数 字操作符显示的值
28.92786setprecision(3)28.9
21.40setprecision(5)21.4
109.50setprecision(4)109.5
34.78596setprecision(2)35

setwsetprecision结合使用

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double value1 = 123.456;
    double value2 = 12.3456;
    double value3 = 1.23456;;

    cout<<setprecision(5);
    
    cout<<setw(8)<<value1<<endl;
    cout<<setw(8)<<value2<<endl;
    cout<<setw(8)<<value3<<endl;
}//允许显示最多 5 个有效数,并以 8 个字符的字段宽度右对齐打印

输出结果:

  123.46
  12.346
  1.2346

fixed()

如果一个数字太大,无法使用 setprecision 指定的有效数位数来打印,则许多系统会以科学表示法的方式打印

为了防止出现这种情况,可以使用另一个流操作符 fixed它表示浮点输出应该以固定点或小数点表示法显示

还是之前的程序:

fixed 操作符与 setprecision 操作符一起使用时,setprecision 即可以以一种新的方式显示。它将指定浮点数字的小数点后要显示的位数,而不是要显示的总有效数位数。而这通常正是我们想要的。

int main()
{
    double value = 123.456;
    cout<<fixed;
    cout<<value<<endl;
    cout<<setprecision(7)<<value<<endl;
    cout<<setprecision(6)<<value<<endl;
    cout<<setprecision(5)<<value<<endl;
    cout<<setprecision(4)<<value<<endl;
    cout<<setprecision(3)<<value<<endl;
    cout<<setprecision(2)<<value<<endl;
    cout<<setprecision(1)<<value<<endl;
}

输出结果:

123.456000//默认6位小数
123.4560000
123.456000
123.45600
123.4560
123.456
123.46
123.5

setbase()

将数字转换为 n 进制(只能指定转换成8,10,16进制)

声明setbase (int base);

参数

base 使用的数字基数的值,如下所示

编号base参数和插入相样
18 oct
210 dec
316 hex

返回值:返回未指定类型的对象。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值