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

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

double d1 = Math.Round(1.25, 1);//1.2double d2 = Math.Round(1.24, 1);//1.2double d3 = Math.Round(1.26, 1);//1.3double 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 value, int 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));

http://www.cnblogs.com/sunney/archive/2010/07/28/1786903.html

时间: 2024-10-10 04:31:44

c# 四舍五入、上取整、下取整的相关文章

sql 中取整,四舍五入取整,向下取整,向上取整。

SELECT round(52.45, 0) AS round4, round(52.54, 0) AS round5, round(52.45, 1) AS round41, round(52.54, 1) AS round51, floor(52.4) AS floor4, floor(52.5) AS floor5, ceiling(52.4) AS ceiling4, ceiling(52.5) AS ceiling5 round是四舍五入 floor是向下取整 ceiling 是向上取

c# 四舍五入、上取整、下取整、百分比

在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果: double d1 = Math.Round(1.25, 1);//1.2double d2 = Math.Round(1.24, 1);//1.2double d3 = Math.Round(1.26, 1);//1.3double d4 = Math.Round(1.35, 1);//1.4 为了用C#来实现“四舍五入”,我写了下面的函数: 代码 /

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

float tmpFloatData2 = 3.7; NSString *tmpStr2 = [NSString stringWithFormat:@"%.0f", tmpFloatData2]; NSLog(@"tmpStr2 = %@", tmpStr2);//结果为4 float tmpFloatData3 = 6.5; NSString *tmpStr3 = [NSString stringWithFormat:@"%.0f", tmpF

js只保留整数,向上取整,四舍五入,向下取整等函数

1.丢弃小数部分,保留整数部分parseInt(5/2)2.向上取整,有小数就整数部分加1Math.ceil(5/2)3,四舍五入.Math.round(5/2) 1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.floor(5/2) Math 对象的方法 方法 描述 abs(x) 返回数的绝对值 acos(x) 返回数的反余弦值 asin(x) 返回

向上/向下取整和四舍五入编程实现

在看Guava Cache的实现源码时,其中有个向上取整操作,它的源码如下: int segmentCapacity = initialCapacity / segmentCount; if (segmentCapacity * segmentCount < initialCapacity) {   ++segmentCapacity; } 关于向上取整.向下取整.四舍五入等操作,有不同的实现,效率上讲,也是基本可以忽略不计,毕竟用的比较少,这里对向上/向下取整和四舍五入的编程实现进行一下整理.

SQL 向上取整、向下取整、四舍五入取整的实例!round、rounddown、roundup

sql server ==================================================== [四舍五入取整截取] select round(54.56,0) ==================================================== [向下取整截取] SELECT FLOOR(54.56) ==================================================== [向上取整截取] SELECT CE

C#以及Oracle中的上取整、下取整方法

1.C#中: 上取整——Math.Ceiling(Double),即返回大于或等于指定双精度浮点数的最大整数(也可称为取天板值): eg:  Math.Ceiling(1.01)=2;      Math.Ceiling(1.37)=2; 下取整——Math.Floor(Double),即返回小于或等于指定双精度浮点数的最大整数(也可称为取地板值): eg:  Math.Floor(1.99) =1;       Math.Floor(1.87) =1; 2.Oracle中: 上取整——ceil

python 向上取整ceil 向下取整floor 四舍五入round

#encoding:utf-8import math #向上取整print "math.ceil---"print "math.ceil(2.3) => ", math.ceil(2.3)print "math.ceil(2.6) => ", math.ceil(2.6) #向下取整print "\nmath.floor---"print "math.floor(2.3) => ", ma

JavaScript基础 Math.floor() 向下取整 小数部分不四舍五入了,有小数就舍去。小数再大,都舍

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut