如果問C#程式員,四捨五入方法是怎麼寫的。很多人上來就會輕而易舉寫上一個Math.Round()方法。但卻不知,其中可悲的奧妙之處!
試寫出下列計算結果:
Math.Round(0.5)
Math.Round(1.5)
肯定有一部分人會寫,計算結果為1和2。
那就大錯特錯了!事實證明,這兩個運算式的結果分別為0和2!這就是很多程式的BUG所在。
細心的程式員們可以看一下MSDN中對Math.Round(Decimal)方法的描述,其中對於傳回值的描述如下:
傳回值
類型:System.Decimal
最接近參數 d 的整數。如果 d 的小數部分正好處於兩個整數中間,其中一個整數為偶數,另一個整數為奇數,則返回偶數。
這就已經充分解釋了,為什麼上面的兩個運算式的傳回值分別為0和2。也證明了簡單的Math.Round(Decimal)方法無法實現四捨五入的功能!
.NET中的Math.Round(),還提供另外一些重載方法,其中一個是Math.Round(Decimal, MidpointRounding)方法,通過這個方法,可以實現對十進位小數的四捨五入。方法如下:
Math.Round(Decimal, MidpointRounding.AwayFromZero)
大功告成!讓我們的程式告別BUG!
------------------------------------------------------------------------------------------------------------------------------------------
.Net中沒有封裝擷取時間戳記(UnixTime,相對於1970年1月1日淩晨的毫秒數)的方法。因此本人寫了如下方法實現。
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
DateTime nowTime = DateTime.Now;
long unixTime = (long)Math.Round((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);