C#四舍五入、上取整、下取整

转载 2011年09月06日 08:22:19

在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果:

double d1 = Math.Round(1.25, 1);//1.2 double d2 = Math.Round(1.24, 1);//1.2 double d3 = Math.Round(1.26, 1);//1.3 double d4 = Math.Round(1.35, 1);//1.4

为了用C#来实现“四舍五入”,我写了下面的函数:

代码
/// <summary> /// 实现数据的四舍五入法    /// </summary> /// <param name="v">要进行处理的数据</param> /// <param name="x">保留的小数位数</param> /// <returns>四舍五入后的结果</returns> private double Round(double v, int x) { bool isNegative = false; //如果是负数 if (v < 0) { isNegative = true; v = -v; } int IValue = 1; for (int i = 1; i <= x; i++) { IValue = IValue * 10; } double Int = Math.Round(v * IValue + 0.5, 0); v = Int / IValue; if (isNegative) { v = -v; } return v; }

经过简单的测试,上面的函数能实现对数据的四舍五入法。

 

Math.Round ()在四舍五入时有个问题:   

Math.Round(2.5,0) = 2;   

Math.Round(3.5,0) = 4;

2.5应该等于3才对!

在ASP中也存在这个问题,不过ASP中还有个FormatNumber可以用,但目前还不知道怎么使用?

解释:

Math.Round()准确的说,这个函数不是四舍五入,而是四舍六入五凑偶,就是说小于4或大于6的该舍该入是没有争议的,而5处在正中间,如果四舍五入则会造成数据的整体偏差,所以采取的原则是:如果舍入位为5,则舍入后最后一位为偶数,这是国际惯例。

现在做的项目都要5入,解决方法:

目前做法是: 

如:(3.45*10+0.5)取整,再除以10

C# 中没有四舍五入函数,事实上我知道的程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法 Banker 's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的 

Math.Round 方法默认的也是 Banker 舍入法 在 .NET 2.0 中 Math.Round 方法有几个重载方法 

Math.Round(Decimal, MidpointRounding) 

Math.Round(Double, MidpointRounding) 

Math.Round(Decimal, Int32, MidpointRounding) 

Math.Round(Double, Int32, MidpointRounding) 

将小数值舍入到指定精度。MidpointRounding 参数,指定当一个值正好处于另两个数中间时如何舍入这个值 

该参数是个 MidpointRounding 枚举 

此枚举有两个成员:

AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较大的值。 

ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。 

所以,要实现四舍五入函数,对于正数,可以加一个 MidpointRounding.AwayFromZero 参数指定当一个数字是其他两个数字的中间值时其舍入为两个值中绝对值较大的值,例: 

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

不过对于负数上面的方法就又不对了 

因此需要自己写个函数来处理 

double ChinaRound(double valueint decimals) 

  if (value < 0) 
  { 
    return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero); 
  } 
  else 
  { 
    return Math.Round(value, decimals, MidpointRounding.AwayFromZero); 
  } 


有些时候不一定要用四舍五入的,可能需要上取整或下取整:

Math.Ceiling()和Math.Floor 

Math.Ceiling(3.1)=4;    
Math.Floor(3.9)=3;

取天板值与地板值,与"四舍五入"无关。其实Floor的结果与(int)相同,因此也可以这样写Math.Floor((double)2/3+0.5)

floor 和 ceil是math unit 里的函数,使用前要先 Uses Math。

trunc 和 round 是system unit 里的函数,缺省就可以用。

floor 直接往小的取,比如 floor(-123.55)=-124,floor(123.55)=123

trunc 直接切下整数,比如 trunc(-123.55)=-123, floor(123.55)=123

ceil 直接往大的取,比如 ceil(-123.55)=-123, ceil(123.55)=124

round 计算四舍五入,比如 round(-123.55)=-124,round(123.55)=124

C#取整函数向上取整实例

int a = 5; 

int b = 2;   

lbl.Text = Convert.ToString(Math.Ceiling((double)a / (double)b)); 

 

 

 

 

 

 

 

 

********************************************************************************************************************************

 

 

c#中取整和取余

"%"为取余号,不用多说。   "/"号现在整形运算是取整,浮点运算时为除法运算,如54/10结果为5,54.0/10.0结果为5.4而且取整时不进行四舍五入只取整数部分,如54/10和56/10是5...
  • byondocean
  • byondocean
  • 2010年06月25日 21:37
  • 46330

c#中取整,向上取,向下取

Math.Ceiling()向上取整,Math.Floor()向下取整 示例:  d = 4.56789 string res = Math.Ceiling(Convert.ToDecimal(d)...
  • orichisonic
  • orichisonic
  • 2016年05月11日 09:17
  • 2195

c# 取整

用到一个数据 类 math ,调用他的方法   1: int类型的相除得到的结果是 int类型的整数 int num = 9/5;【num=1 】  double   num = 9/5;【num...
  • dingxingmei
  • dingxingmei
  • 2012年07月19日 16:09
  • 20885

Math类四个常用方法辨析,floor、ceil、round、rint

Math.floorfloor,英文原意:地板。 Math.floor 函数是求一个浮点数的地板,就是 向下 求一个最接近它的整数,它的 值肯定会小于或等于这个浮点数。再看下面的例子的时候,脑中想...
  • hbwindy
  • hbwindy
  • 2016年05月11日 17:51
  • 4140

C# 取整和四舍五入

double AJS = Math.Round(double.Parse((memberSum * (Agrade / divideBy) + 0.5).ToString()), 0);       ...
  • chenghaibing2008
  • chenghaibing2008
  • 2015年01月26日 15:38
  • 16463

c# 三种取整方法 向上取整 向下取整 四舍五入

Math.Round:四舍六入五取整 Math.Ceiling:向上取整,只要有小数都加1 Math.Floor:向下取整,总是舍去小数 http://www.cnblo...
  • u010082526
  • u010082526
  • 2017年04月27日 15:27
  • 1077

c# 两数相除的三种取整方式 1.向上取整 2.向下取整 3.四舍五入

Math.Round:四舍六入五取整 Math.Ceiling:向上取整,只要有小数都加1 Math.Floor:向下取整,总是舍去小数...
  • qq_25905177
  • qq_25905177
  • 2017年12月06日 14:24
  • 155

C#中 decimal 的四舍五入的处理方法,很简单哦

当:decimal sum = 123456.784M;sum = decimal.Round(sum, 2 , MidpointRounding.AwayFromZero); sum 的值为:123...
  • wangjun2003
  • wangjun2003
  • 2008年03月30日 13:46
  • 11977

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

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

c#将带有小数点的数值四舍五入为整数

  • 2009年06月25日 17:08
  • 35B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#四舍五入、上取整、下取整
举报原因:
原因补充:

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