C++实现对浮点数的四舍五入

C/C++的库中自带的round()函数是用于将浮点数转换为整数的四舍五入方式,并不适用于精确到小数点后几位的要求。

先看代码实现吧:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

double round_double(double number,int loc)
{
	switch (loc)
	{
		case 1:
			if (number > 0)
				return double(int((number + 0.05) * 10)) / 10;
			else
				return double(int((number - 0.05) * 10)) / 10;
		case 2:
			if (number > 0)
				return double(int((number + 0.005) * 100)) / 100;
			else
				return double(int((number - 0.005) * 100)) / 100;
		case 3:
			if (number > 0)
				return double(int((number + 0.0005) * 1000)) / 1000;
			else
				return double(int((number - 0.0005) * 1000)) / 1000;
		case 4:
			if (number > 0)
				return double(int((number + 0.00005) * 10000)) / 10000;
			else
				return double(int((number - 0.00005) * 10000)) / 10000;
		case 5:
			if (number > 0)
				return double(int((number + 0.000005) * 100000)) / 100000;
			else
				return double(int((number - 0.000005) * 100000)) / 100000;
		default:
			break;
	}
}

int main()
{
	cout << "原数字:0.168659" << endl;
	cout << "保留一位小数:" << round_double(0.168659, 1) << endl;
	cout << "保留两位小数:" << round_double(0.168659, 2) << endl;
	cout << "保留三位小数:" << round_double(0.168659, 3) << endl;
	cout << "保留四位小数:" << round_double(0.168659, 4) << endl;
	cout << "保留五位小数:" << round_double(0.168659, 5) << endl;

	cout << "=====================================" << endl;

	cout << "原数字:-0.168659" << endl;
	cout << "保留一位小数:" << round_double(-0.168659, 1) << endl;
	cout << "保留两位小数:" << round_double(-0.168659, 2) << endl;
	cout << "保留三位小数:" << round_double(-0.168659, 3) << endl;
	cout << "保留四位小数:" << round_double(-0.168659, 4) << endl;
	cout << "保留五位小数:" << round_double(-0.168659, 5) << endl;

	return 0;
}

运行结果:

原数字:0.168659
保留一位小数:0.2
保留两位小数:0.17
保留三位小数:0.169
保留四位小数:0.1687
保留五位小数:0.16866
=====================================
原数字:-0.168659
保留一位小数:-0.2
保留两位小数:-0.17
保留三位小数:-0.169
保留四位小数:-0.1687
保留五位小数:-0.16866

其实这种计算方式还是存在一定的缺陷的,比如int类型对数字大小的限制问题等。不过,常用的四舍五入的精确值应该是可以满足的,比如常见算法题中的保留小数点后两位、后三位等等要求。

如果整数部分较大,建议将整数部分分开保存,先将小数四舍五入计算后,再加回给整数部分,即可。

整个计算的实现原理是利用强制类型转换,在int类型和double类型之间转换。先乘倍数,然后转换为int类型,实现舍去不需要的小数位,然后转换为double类型,以便除法运算的时候,保留对应的小数位。

谢谢阅读

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章