在做题的时候总会遇见向上取整或者向下取整或者是四舍五入,这个时候的精度问题,有时候还需要前导自己加0。
在做的时候会遇见很多的问题,有时候直接使用函数比如说floor(向下取整)ceil(向上取整)和round(四舍五入)
直接使用有时候会达到自己想要的结果,但是有时候也会出错。最近一天做了精度问题的题,也遇见一些问题,我把我遇见的问题说出来。
并且把解决方法也说出来,可能还不够完善,后续有新的会补充。
比如说%这个符号非常的眼熟吧,但是这个符号只能用于整数,如果用于浮点数会导致编译错误。这点是小白不清楚的,我也是今天才知道这点的
然后如果要处理浮点数,如果只有2位数,我们可以使用fomd函数来解决。类型要一致。
下面例子演示,记住只能是2位数,多了也会出错。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double num = 10.5;
double divisor = 3.2;
double remainder = fmod(num, divisor);
cout << "余数:" << remainder << endl;
return 0;
}
还有一个点,也是让我眼前一亮
我们在打印有多少位数的时候不是使用的下面这个代码吗???
cout<<fixed<<setprecision(位数)<<打印的数;
但是这个还可以做到四舍五入,这点是非常让我感觉到不可思议的地方,还可以做到前导0的打印出来,非常的好。个人感觉哈。
下面来看看例子
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
double max1=0.00;
double ans=0.00;
double min1=1000.00;
for(int i=1;i<=n;++i){
double num=0.00;
cin>>num;
if(num>max1){
max1=num;
}
if(num<min1){
min1=num;
}
ans+=num;
}
// ans=round(ans/n*100);
ans=ans/n*100;
ans/=100;
cout<<max1<<'\n';
cout<<min1<<'\n';
//cout<<fixed<<setprecision(2)<<ans;
cout<<fixed<<setprecision(2)<<ans;//<<"."<<ans/100;
return 0;
}
下面代码没有问题了,但是遇见前导0的时候就不能够正确的打印了,所以只能过样例的80%
但是经过修改过后就可以过100%
我们在确定精度的时候也可以先乘以相应的数比如说100,然后在后面除掉,这样也可以保存到我们想要的精度。这点也是运用的非常多的地方。
下面在来一道题演示 蓝桥 2021 省赛
在演示之前,告诉大家一个知识点,setw(数字)表示打印的宽度,然后setfill('0')表示填充字符0,这点在打印不足以2位的时候,会补充0。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
double n;
cin >> n;
double sum = n / 1000.0; // 转换成秒
// 输出小时部分
cout << fixed << setprecision(2) << setw(2) << setfill('0') << (int)(sum / 3600.0) % 24 << ":";
// 输出分钟部分
cout << setw(2) << setfill('0') << (int)(sum / 60.0) % 60 << ":";
// 输出秒部分
cout << setw(2) << setfill('0') << (int)sum % 60;
return 0;
}