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类型,以便除法运算的时候,保留对应的小数位。
谢谢阅读