話說,最近一次系統維護 用JS讀取導入Excel中的實驗數據,出現被自動四捨五入。後來到客戶現場聽客戶反饋 Excel實驗數據要求 奇進偶不進。
關於 奇進偶不進 產生的由來:從統計學的角度,“奇進偶捨”比“四捨五入”要科學,在大量運算時,它使捨入後的結果誤差的均值趨於零,而不是像四捨五入那樣逢五就入,導致結果偏向大數,使得誤差產生積累進而產生系統誤差,“奇進偶捨”使測量結果受到捨入誤差的影響降到最低。
Math下找了下,使用Round 的重載,使用 MidpointRounding.ToEven 就可以實現 奇進偶不進。
// 4 double d = 5.214; double res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//5.21 //6 d = 5.216; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//5.22 //5 d = 5.215; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//5.22 d = 5.225; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//5.22 //不止小數點後3位時 d = 0.7865666; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//0.79 d = 0.786; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//0.79 d = 0.785; res = Math.Round(d, 2, MidpointRounding.ToEven); Console.WriteLine(res);//0.78