C语言中Round四舍五入的实现以及解析

由于最近要上新系统,所以要公司重新写一套自己的gui框架,组长分配了一些任务给我,就是实现一些基本功能,当然源码还得看Qt的框架和源码重写系统。

由于Round的四舍五入的函数再0.5处具有不确定性,我们可以参照一下Qt源码的qRound的实现:

constexpr inline int qRound(double d)
{ return d >= 0.0 ? int(d + 0.5) : int(d - double(int(d-1)) + 0.5) + int(d-1); }

下面对上述函数做一些自己的解读:

在进行四舍五入考虑的时候考虑两点:

1.正负数操作的不一致性

2.0.5边界左右的操作的不一致性

当 d>0.0 时,int(d+0.5)的原理不加解释

当 d<0.0 时,分为两部分处理:

1)整数部分处理:int(d-1) 的处理是先将所有负数-1处理,即:int(-0.6-1)  = -1;int(-1.6-1) = -2;

2)小数部分处理(0.5边界处理):d - double(int(d-1))+ 0.5的意义在于:小数部分-1+0.5可以将小数部分的转换为-1.xxx和0.xxx,经过取 int 之后获得整数

3)前两部汇整之后就是四舍五入之后的值了

Note:

刚刚自己实现了一个更简单的,测试了一下没有发现错误:

constexpr inline int myRound(float f)

{ return f >= 0 ? int ( f+0.5 ) : int ( f-0.5 ) ; }

如若有错,请即时留言,马上更正......

猜你喜欢

转载自blog.csdn.net/qq_35185913/article/details/83856269
今日推荐