思路:如果直接对一个浮点数取四舍五入,不保留小数部分,那么我们的思路是:正数加上0.5,负数减去0.5,代码如下:
1 #include <iostream>
2
3 using namespace std;
4
5 int round1(double number)
6 {
7 return (number>0.0)?(number+0.5):(number-0.5);
8 }
或者
1 #include <iostream>
2 #include <cmath>
3
4 using namespace std;
5
6 int round2(double number)
7 {
8 return (number>0.0)?floor(number+0.5):ceil(number-0.5);
9 }
如果要对浮点数按位四舍五入,就要换种方式。比如要对1.12345保留4位小数,先乘以10000(10^4,几位小数就是几次方),然后加0.5,得11235,再除以10000,得到1.1235。代码如下:
1 //按位四舍五入
2 #include <iostream>
3 #include <stdio.h>
4 using namespace std;
5
6 double round3(double number,int bits) //number->浮点数,bits->保留位数
7 {
8 for(int i=0;i<bits;++i)
9 {
10 number*=10;
11 }
12 number=(long long)(number+0.5);
13 for(int i=0;i<bits;++i)
14 {
15 number/=10;
16 }
17 return number;
18 }
19
20 int main()
21 {
22 double x;
23 int n;
24 cin>>x>>n;
25 printf("%.15f",round3(x,n));
26 }
但这样做也有个bug,就是double的精度只在小数点后15-16位之间(正数15位,负数16位),所以最多也只能精确到这样子,n更大就失效了。如果有更高精度的需求,想到再更。