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

发表于2016-08-31
评论0 2.9k浏览


Math.Round(0.4) //result:0


Math.Round(0.5) //result:0


在unity3D客户端开发的时候,会出现很多计算出来的数值,但是只能显示整数,因此用Math.Round()方法实现四舍五入。

但C#中的Math.Round(decimal d)并不是使用的"四舍五入"法。其实在VB、C#等语言中中Round函数都是采用Banker's rounding(银行家算法),即:四舍六入五取偶。事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的"四舍五入"。即: Math.Round(4.5, MidpointRounding.AwayFromZero) = 5

Math.Round(0.3) //result:0

Math.Round(0.5) //result:0//取偶

Math.Round(0.9) //result:1

Math.Round(1.5) //result:2//取偶

Math.Round(2.5) //result:2//取偶

 使用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


所以,这种方法可以实现四舍五入,但是,如果用这个进行小数运算,就会有问题了,所以使用小数运算应该使用下面的方法

decimal Round(decimal d, int decimals, MidpointRounding mode)

Math.Round(356.325, 2)

356.32

Math.Round(356.325, 2,MidpointRounding.AwayFromZero)

356.32

Math.Round((decimal)356.325, 2)

356.32

Math.Round((decimal)356.325, 2,MidpointRounding.AwayFromZero)

356.33

最后的结果才是正确结果


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论