C/C++如何保留浮点型变量的小数点位数

在实际开发中,往往需要对获取的变量进行小数点位数控制,而常见的printf()函数,一般只在打印时对变量精度进行控制,而实际工作中,可能需要作为返回值或者变量再次使用,该函数就不能满足使用要求,因此,本文,提供如下两种方法实现。
printf()函数的用例

 printf("CPURate=%.2f\n", CPURate);//保留2位
 printf("CPURate=%.1f\n", CPURate);//保留1位
  1. 本文提供两种浮点数方法

方法一:

//头文件 
//#include<cmath>    //c++头文件
//#include<math.h>   //c头文件

//C++ double类型保留小数点位
void decimal_1()
{
	double CPURate = 20.3822;
	CPURate = round(CPURate * 100) / 100;//保留小数点后两位
	cout << "保留小数点后两位:"<<CPURate << endl;
	CPURate = round(CPURate * 10) / 10;//保留小数点后一位
	cout << "保留小数点后一位:"<< CPURate << endl;
  

    //利用round()函数
	CPURate=round(CPURate);//四舍五入取整数
	cout << "20.3822的round()值:"<<CPURate << endl;
}

方法二:

void decimal_2()
{
	double CPURate = 20.3822;
	//保留小数点后两位
	CPURate = (int)(100.0 * CPURate + 0.5) / 100.0;
	cout << CPURate << endl;     //20.38
    //保留小数点后一位
	CPURate = (int)(10.0 * CPURate + 0.5) / 10.0;
	cout << CPURate << endl;     //20.4
}
  1. 静态常量区分析
void decimal_3()
{
	double CPURate = 20.3822;

	CPURate = (int)(10.0 * CPURate + 0.5) / 10.0;//保留1位
	cout << CPURate << endl;     //20.4

	CPURate = (int)(100.0 * CPURate + 0.5) / 100.0;//保留2位
	cout << CPURate << endl;    //20.4

	//上面的程序为什么不能像上面方法1、2那样,分别打印20.38和20.4那?
	/*因为,CPURate作为一个字符常量,存放在全局区。
	字符常量在内存中,只存有一份,因此,第一次操作之后,常量区CPURate的值已经变为20.4了,再次执行第二次浮点数保留操作,是向高精度转换,是在第一次操作结果(20.4)的基础上转换的,因此,只能原样输出;而前面方法1、2两次输出结果不同,是因为,第一次操作之后,常量区CPURate的值已经变为20.38了,再次执行第二次浮点数保留操作,是继续向低精度转换的,是在第一次操作结果(20.38)的基础上操作的,可以转换成功,转变位20.4,因此,两次输出结果不同。
	
	*/
}

总结:实际开发中,保留浮点数小数点位数时,一般用于高精度向低精度转换,采用以上两种方法(本文前面)即可。但是,对同一变量重复使用精度转换时,应该注意,精度逐渐向低转换时,可以成功,精度逐渐向高转换时,一般打印失效。可以从 decimal_2()和 decimal_3()示例中观察,从而,思考字符常量在内存中的操作原理。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值