在c++题目中有时会遇到这样的问题,题目让你进行四舍五入,比如说4.55,那么我们用printf只能输出4.5,而不能输出,而直接用cout会输出4.55,也不会出现4.6我们想要的结果,无论是用printf还是setpricision,都不行,现在我们有两种方法,题目如下
夏天到了,超市里摆满了各种各样的应季水果。现在知道:西瓜的价钱是每斤 1.2 元;桃子的价格是每斤 3.5 元;葡萄的价格是每斤 4.5 元;苹果的价钱是每斤 5 元。现在分别给出上述四种所购买的斤数(均不超过 20),请你编写程序帮助售货员阿姨计算并依次输出顾客购买四种水果需要的钱数及总钱数。
收起
输入
输入只有一行,包含四个符合题目要求的非负实数,依次表示需要购买西瓜、桃子、葡萄和苹果的斤数。两两之间用一个空格分隔。 输入的实数至多有1位小数,(也就是,一定是0.1斤的整数倍)
输出
输出应有五行,每行包含一个数,依次代表购买西瓜、桃子、葡萄、苹果所需的钱数,以及购买四种水果所需的总钱数。 所有输出数据均采取四舍五入保留一位小数(若小数点后为 0,也应输出这一位 0)。 你需要考虑「四舍六入五留双」与四舍五入之间的差别。
输入样例
4 3 2.5 6
输出样例
4.8 10.5 11.3 30.0 56.6
代码如下:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<iomanip>
using namespace std;
int main() {
double a,b,c,d,f;
cin>>a>>b>>c>>d;
f=a*1.2+b*3.5+c*4.5+d*5;
a=a*1.2;
b=b*3.5;
c=c*4.5;
d=5.0*d;
a=(double)((int)(a*10+0.5))/10.0;
b=(double)((int)(b*10+0.5))/10.0;
c=(double)((int)(c*10+0.5))/10.0;
d=(double)((int)(d*10+0.5))/10.0;
printf("%.1f\n%.1f\n%.1f\n%.1f\n%.1f\n",a+0.01,b+0.01,c+0.01,d+0.01,f+0.01); //重点就在这了,只要把每一个数+0.01,比如4.55变成4.56,这样就符合四舍六入五留双,让其变成4.6,而如果是4.54+0.01成了4.55,也会因为我们只输出一位而变成4.5
return 0;
}
第二种方法不详细写了,他是一种可以任意进行保留小数的方法,假如f要保留n位数那么
f=(double)((int)(f*pow(10,n)+0.5))/pow(10,n)
意思是保留几位小数,乘十的几次方,因为是保留小数,其下一位成了第一位小数,+0.5,如果本身大于0.5,那么向前进一,实现了五入,而如果其小于5,那么因为int取整,直接将小数部分抹掉。最后再除上十的n次方,就得到我们要的小数。