double数据的上取整和下取整,以及四舍五⼊法
在处理⼀些数据时,我们希望能⽤“四舍五⼊”法实现,但是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>
privatedouble 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));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论