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類型,以便除法運算的時候,保留對應的小數位。

謝謝閱讀

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