#include<iostream>
#include<cmath>
using namespace std;
不论输入的是多少位小数,我们需要的是保留两位小数,所以需要接触到的关键点是小数点后第三位。
四舍六入五成双版(常见于分析化学有效位数取舍)。
规则:
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,
也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,
"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;
当5后无有效数字时,
需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)
由于计算机中大量的浮点数都是带有很多位的,为了体现四舍六入五成双的算法。
根据题目需要的2位小数,我统一截取4位小数开始计算。
这样子会有一个bug,比如9.82501,因为截取了4位小数,所以修正出来是9.82,正确答案是9.83。
但是只是为了演示,实际上必须是取定位数来统一输入,再用这个算法。
可以再优化为要求输入小数的位数或判断输入数据的位数,但是这需要到数组和字符串的知识。
*/
double intercept(double number) {
int integer = static_cast<int>(number);
double knumber = number * 10000;
int kinteger = static_cast<int>(knumber);
double dnumber = kinteger / 10000.0;
return dnumber;
}
double rounding(double number) {
double temp = intercept(number);
int ktemp = static_cast<int>(temp * 10000);
int integer_result = static_cast<int>(temp);
double digital_result = temp - integer_result;
int judge_number = (((ktemp % 100000) % 10000) % 1000) % 100;
if (judge_number != 50) {
if (judge_number <= 49) {
return integer_result + (static_cast<int>(digital_result * 100)) / 100.0;
}
else {
return integer_result + (static_cast<int>(digital_result * 100)) / 100.0 + 0.01;
}
}
else {
if ((ktemp / 100) % 2 == 0) {
return integer_result + (static_cast<int>(digital_result * 100)) / 100.0;
}
else {
return integer_result + (static_cast<int>(digital_result * 100)) / 100.0 + 0.01;
}
}
}
int main() {
double number;
double result;
while (!cin.fail()) {
cin.clear();
cin.sync();
cout << "请输入一个实数:";
cin >> number;
result = rounding(number);
cout << number << "经过四舍六入五成双以后的结果是" << result << endl;
}
system("pause");
return 0;
}