【测绘专用】四舍六入五成双的C++实现

2018-02-03 10:19:24来源:网络收集作者:咖啡不加糖人点击

分享

鉴于下学期广东某男子技工学校将举办数测程序设计大赛,故把数测中经常用的这个四舍六入用C++实现一下。


作为一名测绘的学生,在内业计算中经常遇到遇到小数点后保留几位小数的问题。根据《工程测量实验教程》(王宇会 著)一书,内业计算按“四舍六入,五前单进双舍(或称奇进偶不进)”的取舍规则进行尾数的取舍。如数据1.1235和1.1245小数点后保留三位时,均应为1.124


//四舍六入五成双的基于C++11的实现
//C++11中sprintf、strncpy由于VS2015会报错,所以在这里改用sprintf_s、strncpy_s
#include
#include
#include
using namespace std;
const int n = 1000;//设置要保留的位数
char s1[20];
char s2[20];
int main()
{
double a1, a2, a3;
cin >> a1;
a2 = a1*n; //将输入的数据乘以n,使得小数点后的第一位使我们要判断的是否为5的数
sprintf_s(s1, "%lf", a2);//将double类型的a2打印到字符数组s1里面去
int b = strcspn(s1, ".");//整型b即为小数点在字符数组中序号
char c = s1[b + 1];//字符c即为小数点后一位数
if (c<'5')//如果c小于5,则后面的舍去
{
strncpy_s(s2, s1, b);
a3 = atof(s2);
}
else
{
if (c>'5')//如果c大于5,则进1
{
strncpy_s(s2, s1, b);
a3 = atof(s2) + 1;
}
else
{
//如果c大、等于5,则对前一位数进行判断奇偶
c = s1[b - 1];
if ((c % 2) != 0)//C前一位为奇则进1
{
strncpy_s(s2, s1, b);
a3 = atof(s2) + 1;
}
else
{
strncpy_s(s2, s1, b);
a3 = atof(s2);
}
}
}
a3 = a3 / n;
cout << a3 << endl;//输出结果
return 0;
}
//四舍六入五成双的C++实现欢迎各位留言提意见 

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台