今天做項目碰到的事情,是根據權重計算平均分。
現有4個組員,1個組長,所有組員權重70%,組長權重30%。
組員打分分別為:4分、5分、5分、3分,組長打分為:5分
根據權重規則有以下表達式:
(4+5+5+3)/4*0.7+5*0.3
正確的計算結果應該是4.475,而C#計算出來的是4.3,那么這個4.3是怎么來的?
經過追蹤,我發現在(4+5+5+3)/4這里就出現了問題,它這里的計算結果為17/4=4,4*0.7+5*0.3=4.3。
原因可能為:
整數除整數,默認以整數結果保留
找到了問題所在,那么解決問題也就是簡單的事情了。
參與計算之前將該數轉換為decimal:
//ZZ是組長分數,zySum是組員總分,length是組員總數
//注意:如果因為邏輯易讀性寫成 AvgNum = zySum / Length * 0.70M + zz * 0.30M 則會發生以上小數位丟失的問題,
//因為zySum是整數,而length也是整數,解決方法是在zySum參與計算之前,將其轉換成decimal類型,如下:
//AvgNum = zySum*1.00M / Length * 0.70M + zz * 0.30M
AvgNum = zz * 0.30M + zySum * 0.70M / Length;