如果问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);