SQL server和C#,VB.net中Round方法的差异

来源:互联网 发布:数据分析类网站 编辑:程序博客网 时间:2024/06/06 03:05

在C#中使用Math.Round(1.25, 1),期望得到1.3,结果却是1.2。
1.因为Math.Round方法并不是遵循四舍五入的原则,而是采用“四舍六入五成双”这种方式,若需要舍入到的位的后面"小于5"或"大于5"的话,按通常意义的四舍五入处理.若"若需要舍入到的位的后面"等于5",则要看舍入后末位为偶数还是奇数,举例:
Math.Round(1.25, 1) = 1.2 因为5前面是2,为偶数,所以把5舍去不进位
Math.Round(1.35, 1) = 1.4 因为5前面是3,为奇数,所以进位
而0也看成为偶数,所以Math.Round(0.5, 0) = 0


2.从统计学的角度,"四舍六入五成双"比"四舍五入"要科学,它使舍入后的结果有的变大,有的变小,更平均.而不是像四舍五入那样逢五就入,导致结果偏向大数.
例如:1.15+1.25+1.35+1.45=5.2,若按四舍五入取一位小数计算
1.2+1.3+1.4+1.5=5.4
按"四舍六入五成双"计算,1.2+1.2+1.4+1.4=5.2,舍入后的结果更能反映实际结果

3.在C#和VB.net,都是"四舍六入五成双"原则,而 Sql Server 是简单的"四舍五入"。
但是如果单独对一个数进行四舍五入,这种方法明显是不行的,因为Math.Round(0.5, 0) = 0,所以需要另外自己写一个方法去实现,下面是在我们项目中用的方法,供大家参考:
C#代码 
  1. public staticdecimal Round(decimal d,int decimals)  
  2. {  
  3. decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));  
  4. decimal scrD = d * tenPow + 0.5m;  
  5. return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);  

另外,如果小数位足够长,也可以Decimal.Round这个方法,举例:
Decimal.Round(1.25, 1) = 1.2
但是如果是 Decimal.Round(1.251, 1) = 1.3
所以采用下面的方法也能达到四舍五入的效果
C#代码 
  1. public staticdecimal MyDecimalRound(decimal d,int decimals)  
  2. {  
  3. d = d + 0.000000000000001m;  
  4. return Decimal.Round(d, decimals);  
原创粉丝点击