首页 » C语言 » 【测绘专用】四舍六入五成双的C++实现

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

原文 http://blog.csdn.net/qq_34844814/article/details/79219525

2018-02-01 02:00:51阅读(520)

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

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

//四舍六入五成双的基于C++11的实现
//C++11中sprintf、strncpy由于VS2015会报错,所以在这里改用sprintf_s、strncpy_s
#include <iostream>
#include <string.h>
#include <stdio.h>
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++实现



欢迎各位留言提意见 

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹