在实际开发中,往往需要对获取的变量进行小数点位数控制,而常见的printf()函数,一般只在打印时对变量精度进行控制,而实际工作中,可能需要作为返回值或者变量再次使用,该函数就不能满足使用要求,因此,本文,提供如下两种方法实现。
printf()函数的用例
printf("CPURate=%.2f\n", CPURate);//保留2位
printf("CPURate=%.1f\n", CPURate);//保留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
}
- 静态常量区分析
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()示例中观察,从而,思考字符常量在内存中的操作原理。