1. 程式人生 > >C語言中Round四捨五入的實現以及解析

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 ) ; }

如若有錯,請即時留言,馬上更正......