张银的博客


Eat to live, but do not live to eat.

导航

C#中的四舍五入方法、C#中获取时间戳(UnixTime)的方法

Posted on 2012-03-30 15:02  张银  阅读(2578)  评论(1编辑  收藏  举报

  如果问C#程序员,四舍五入方法是怎么写的。很多人上来就会轻而易举的写上一个Math.Round()方法。但却不知,其中可悲的奥妙之处!

试写出下列计算结果:

  Math.Round(0.5)
  Math.Round(1.5)

  肯定有一部分人会写,计算结果为12

  那就大错特错了!事实证明,这两个表达式的结果分别为02!这就是很多程序的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);