c++数位操作

本文介绍了C++中用于数值输出的一些关键函数,包括setprecision用于设定有效数位,fixed进行数位模式转换,setw控制数的宽度,setfill指定填充字符,以及setbase进行进制转换。文章详细讨论了这些函数的使用场景和效果,例如setprecision在fixed模式下的不同表现,setw和setfill的组合使用,以及setbase在不同进制间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鉴于这部分比较重要,还是单独写吧 

前言:

我真的哭死,我应该在c++入门的时候就去看这个的

每次在保留小数的时候我都是用的c的printf的格式控制符,这虽然偷懒又方便但是在某些情况下是无用的甚至会很搞心态

比如使整数保留n宽度,这种方法完全没用

参考链接

 简单介绍一下下面几种函数

setprecision(有效数位)    及fixed的数位输出模式转换 

这种方式输出会四舍五入 

c++和c在这里不同

c是默认保留小数点后六位

而c++是默认保留6位有效数,而默认情况下setprecision是控制数的有效位数

c++也可以用fixed转换成c的模式

 这个时候setprecision(n)就是控制小数点后多少位了,看到这里,着实感到c++功能多

只是自己没学到罢了

fixed的移除

我目前看到的最简单的是这样用的(奇奇怪怪比较难记,不得了再翻)

cout.unsetf( ios::fixed );
//还有一个cout.unsetf( ios::floatfield);
//这里对今天的学习影响不大,就不讨论了

setw(数的宽度)//默认右对齐

Cao  太多了  左右对齐和showpoint很有用

链接

明天(02.10)出一个代替c的标准准输入输出的c++版本 

和格式控制符有异曲同工之妙  超过宽度控制无效

setfill(‘@’)(一般与setw连用)

这个用来填充setw中的空格部分,默认为空格 

现在可以完全代替c的格式控制符的printf了,但是c还是直观一些

setbase(int n进制) 

 将后面输出的数转化为n(8/10/16)进制输出,可与setw连用(setprecision暂时没试过,一般也不会考小数的进制转换吧)

showpoint(取消了   默认的末尾0自动取消这一特性) 

一般来说fixed+precision就能解决保留小数点的问题,这里不细讲,平时我也不会在怎么去用这个

要是发现了什么新特性再嗦

正文部分 

 (1)保留小数(setprecision(int n))(可以为变量或常量)

这是我最开始写的 :

这个说法并不是很对,应该是保留有效数位,
暂时还没找到保留小数后多少位,暂时用printf的格式控制符凑合吧 

其实setprecision在不同的fixed的设置下会有两种小数输出方式 

函数:  setprecision( )

位数参数写在括号里面比如我们要保留变量至3位有效数位至3位

ps:未fixed末尾不会有多余的0哦!(不足四舍五入)

 

代码:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	double a, b;
	cin >> a >> b ;
	cout << setprecision(3) << a/b << endl;
	
	return 0;
}

有多余0情况

不足(这里改成保留2位小数)

直接去尾

不过保留n为小数解决了   现在不知道怎么解决是整数占n位……(下面已解决)

参考博客

这篇应该是上一篇博客推陈出新

看了下日期,相隔甚久……

又一个很奇怪且致命的问题:有时候setprecision不会四舍五入!!!暂时还不知道为什么

 救命,居然没有四舍五入

为什么这个又可以了

 

(2)占位函数stew(int n)(可以为变量或常量)

姑且这么说吧(左对齐先放一边慢慢来)

哭死,期末考试就考了将整数保留n宽度,最后几分钟程序敲出来了硬是格式错误

    while(n--)
    {
        cout<<"数字 & 宽度"<<endl;
        cin>>num>>m;
        cout<<setw(m)<<num<<endl;
    }

效果:

 (3)后面数字进制转换(setbase(8))//将后面的数转化成八进制(可以为变量或常量)

只能是8  10  16这三个数字   其他数字会使得该setbase无效(不过10好像和无效 是一个效果)

如参数为11的情况:

参数为8的情况:

(4)setfill(‘@’)

#include <iostream>
#include <iomanip>
#include<cstdio>
using namespace std;

int main()
{
	long m,n;
	double b,a;
	int t,num=16;
	cout<<"m  位"<<endl;
	cin>>m>>n;
	cout<<setfill('@')<<setw(n)<<m<<endl;
    //cout.unsetf( ios::fixed );


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值