找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1921|回复: 1

[分享] C# vb.net四舍五入

[复制链接]
发表于 2013-7-20 00:12:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在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 static decimal Round(decimal d, int decimals)  
  2.   {  decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));  
  3.      decimal scrD = d * tenPow + 0.5m;
  4.      return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);
  5. }

VB.NET代码

  1. Public Shared Function Round(d As Decimal, decimals As Integer) As Decimal   
  2.      Dim tenPow As Decimal = Convert.ToDecimal(Math.Pow(10, decimals))   
  3.     Dim scrD As Decimal = d * tenPow + 0.5D      
  4.   Return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow)
  5. End Function

另外,如果小数位足够长,也可以Decimal.Round这个方法,举例:
Decimal.Round(1.25, 1) = 1.2
但是如果是 Decimal.Round(1.251, 1) = 1.3
所以采用下面的方法也能达到四舍五入的效果
C#代码  
public static decimal MyDecimalRound(decimal d, int decimals)  
{  
d = d + 0.000000000000001m;  
return Decimal.Round(d, decimals);  
}
VB.NET代码
Public Shared Function MyDecimalRound(d As Decimal, decimals As Integer) As Decimal
       d = d + 0.000000000000001D     
   Return [Decimal].Round(d, decimals)
End Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-12-25 14:38:27 | 显示全部楼层
好东西,真的不错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 00:13 , Processed in 0.386143 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表