C#中Math.Round()实现中国式四舍五入

转载 2016年12月28日 10:47:10

C#中Math.Round()实现中国式四舍五入

 

C#中的Math.Round()并不是使用的"四舍五入"法。其实在VB、VBScript、C#、J#、T-SQL中Round函数都是采用Banker's rounding(银行家算法),即:四舍六入五取偶。事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法。

.NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的"四舍五入"。即: Math.Round(4.5, MidpointRounding.AwayFromZero) = 5。

复制代码
Round(Decimal)
Round(Double)
Round(Decimal, Int32)
Round(Decimal, MidpointRounding)
Round(Double, Int32)
Round(Double, MidpointRounding)
Round(Decimal, Int32, MidpointRounding)
Round(Double, Int32, MidpointRounding)
复制代码

 

 如:

Math.Round(0.4) //result:0

Math.Round(0.6) //result:1

Math.Round(0.5) //result:0

Math.Round(1.5) //result:2

Math.Round(2.5) //result:2

Math.Round(3.5) //result:4

Math.Round(4.5) //result:4

Math.Round(5.5) //result:6

Math.Round(6.5) //result:6

Math.Round(7.5) //result:8

Math.Round(8.5) //result:8

Math.Round(9.5) //result:10

   使用MidpointRounding.AwayFromZero重载后对比:   

Math.Round(0.4, MidpointRounding.AwayFromZero); // result:0

Math.Round(0.6, MidpointRounding.AwayFromZero); // result:1

Math.Round(0.5, MidpointRounding.AwayFromZero); // result:1

Math.Round(1.5, MidpointRounding.AwayFromZero); // result:2

Math.Round(2.5, MidpointRounding.AwayFromZero); // result:3

Math.Round(3.5, MidpointRounding.AwayFromZero); // result:4

Math.Round(4.5, MidpointRounding.AwayFromZero); // result:5

Math.Round(5.5, MidpointRounding.AwayFromZero); // result:6

Math.Round(6.5, MidpointRounding.AwayFromZero); // result:7

Math.Round(7.5, MidpointRounding.AwayFromZero); // result:8

Math.Round(8.5, MidpointRounding.AwayFromZero); // result:9

Math.Round(9.5, MidpointRounding.AwayFromZero); // result:10

   

   

但是悲剧的是,如果用这个计算小数的话,就不灵了!!!

必须用第七个重载方法,
decimal Round(decimal d, int decimals, MidpointRounding mode)

这样计算出来的小数才是真正的中国式四舍五入!!

    

复制代码
?Math.Round(526.925, 2)
526.92

?Math.Round(526.925, 2,MidpointRounding.AwayFromZero)
526.92

?Math.Round((decimal)526.925, 2)
526.92

?Math.Round((decimal)526.925, 2,MidpointRounding.AwayFromZero)
526.93
复制代码

 

  

C#中Math.Round四舍五入的用法详解,

关于C#里面的Math.Round,很多人都会用到,而且以为是四舍五入,其实不是这样的: C#里面的Math.Round是符合IEEE标准的“四舍五入”,其实是五舍六入。看下面测试: ...
  • AAA123524457
  • AAA123524457
  • 2016年03月22日 16:33
  • 4322

C#关于中国式的四舍五入

最近处理数据发现将数据格式化时四舍五入结果有偏差,网上查了下,有些帖子对于这个问题的处理比较麻烦,后来发现C#对于这种问题提供了处理方式 转自:http://www.cnblogs.com/fany...
  • trnsfr
  • trnsfr
  • 2015年03月18日 14:38
  • 225

C#中Math.Round()实现中国式四舍五入

转自:http://www.cnblogs.com/fanyong/archive/2013/05/30/chinese_round.html
  • chelen_jak
  • chelen_jak
  • 2014年07月03日 11:51
  • 3226

Math.Round()方法可能与我们想象的大不一样(JS、C#)

我们以前学数学都知道四舍五入,其实从字面上就可以很好理解,凡是小于或等于4的舍去,大于或等于5的进一。 那么,问题来了,在C#中我们用Math.Round()是上面的意思吗? Math.Round(...
  • hougelou
  • hougelou
  • 2017年04月24日 18:44
  • 461

.Net中Math.Round与四舍五入(转载)

有不少人误将Math.Round函数当作四舍五入函数在处理, 结果往往不正确, 实际上Math.Round采用的是国际通行的是 Banker 舍入法. Banker's rounding(银行家舍入)...
  • bigheadsheep
  • bigheadsheep
  • 2014年11月06日 15:23
  • 2582

java Math.round() Java中的四舍五入函数

public class MathTest {        public static void main(String[] args) {            System.out....
  • xusongsong520
  • xusongsong520
  • 2013年01月16日 12:41
  • 36852

C#处理四舍五入的问题

在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果:double d1 = Math.Round(1.25, ...
  • oneiter
  • oneiter
  • 2007年05月26日 19:29
  • 10779

Math.Round函数四舍五入的问题

今天客户跑过来跟我说,我们程序里面计算的价格不对,我检查了一下,发现价格是经过折算后的价格,结果是可能小数位较多,而单据上只能打印两位价格,所以就对价格调用Math.Round(price,2)函数进...
  • wxnjob
  • wxnjob
  • 2013年12月30日 15:24
  • 888

Math.Round 之关于 不同的四舍五入

之前有一直被误导,以为就是简单的四舍五入。 写这篇文章之前也是搜索一下,博客园中也是很多写过关于的文章。 本以为是很简单的就过去了,却发现了一个很不同现象。下面等我慢慢道来。 Math.Roun...
  • waterdemo
  • waterdemo
  • 2016年05月27日 18:47
  • 1438

Math.Round是四舍五入还是五舍六入

Math.Round是四舍五入还是五舍六入
  • hcw_peter
  • hcw_peter
  • 2010年10月15日 16:27
  • 12977
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中Math.Round()实现中国式四舍五入
举报原因:
原因补充:

(最多只允许输入30个字)