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