由于最近要上新系统,所以要公司重新写一套自己的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 时,分为两部分处理:
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 ) ; }
如若有错,请即时留言,马上更正......
文章来源: C语言中Round四舍五入的实现以及解析