有时对于有小数位的数据要进行取整操作或者舍入操作,这里简短说一下实现方法。
1、小数取整
取整分两种,向上取整和向下取整。
向上取整:返回大于或等于指定双精度浮点数的最小整数。
若对象是正数,则去掉所有的小数位,并使整数位加1;
若对象是负数,则去掉所有的小数位,保留整数位;
向下取整:返回小于或等于指定双精度浮点数的最大整数。
若对象是正数,则去掉所有的小数位,保留整数位;
若对象是负数,则去掉所有的小数位,并使整数位减1;
以数据:666.12345 为例
向上取整:
//正数
Math.Ceiling (666.12345);//结果为667。
//负数
Math.Ceiling (-666.12345);//结果为-666。
向下取整:
//正数
Math.Floor(666.12345);//结果为666。
//负数
Math.Floor(-666.12345);//结果为-667。
2、保留指定位数的小数
保留小数分两种,保留的同时进行四舍六入和只保留小数不进位。
保留的同时进行四舍六入:指定位数后面的小数,如果为小于等于4,舍去;如果为大于等于6,进位;
如果等于5,则看保留的最后一位,若它为奇,进位;若为偶,舍去。
只保留小数不进位:直接截取,不进位不舍去。
使用方法:Round()
保留的同时进行四舍六入
//四舍
Math.Round(666.24, 1); //结果为666.2
//六入
Math.Round(666.26, 1); //结果为666.3
//五取偶
Math.Round(666.25, 1); //结果为666.2
Math.Round(666.35, 1); //结果为666.4
只保留小数不进位
方法一:对原始数据,保留几位就乘10的几次方,然后用Truncate截取整数部分,再对得到的整数部分除以10的几次方
Math.Truncate(666.1234 * 100) / 100; //截取两位小数
方法二:对原始数据,先转化为字符型,再转回原始类型;
double a = 666.1234;
string b = a.ToString("#0.00"); //小数据点后面几个0,就相当于保留几位。
a = double.Parse(b);
四舍五入的一种方法
对原始数据,先转化为字符型,再转回原始类型;
double a = 666.1234;
string b = a.ToString("f2"); // fN,保留 N 位,四舍五入。
a = double.Parse(b);
更为专业的处理方法
.NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的"四舍五入"。即: Math.Round(4.5, MidpointRounding.AwayFromZero) = 5。
Math.Round(0.4) //result:0
Math.Round(0.6) //result:1
Math.Round(0.5) //result:0
Math.Round(1.5) //result:2
Math.Round(2.5) //result:2
Math.Round(3.5) //result:4
Math.Round(4.5) //result:4
Math.Round(5.5) //result:6
Math.Round(6.5) //result:6
Math.Round(7.5) //result:8
Math.Round(8.5) //result:8
Math.Round(9.5) //result:10
使用MidpointRounding.AwayFromZero重载后对比:
Math.Round(0.4, MidpointRounding.AwayFromZero); // result:0
Math.Round(0.6, MidpointRounding.AwayFromZero); // result:1
Math.Round(0.5, MidpointRounding.AwayFromZero); // result:1
Math.Round(1.5, MidpointRounding.AwayFromZero); // result:2
Math.Round(2.5, MidpointRounding.AwayFromZero); // result:3
Math.Round(3.5, MidpointRounding.AwayFromZero); // result:4
Math.Round(4.5, MidpointRounding.AwayFromZero); // result:5
Math.Round(5.5, MidpointRounding.AwayFromZero); // result:6
Math.Round(6.5, MidpointRounding.AwayFromZero); // result:7
Math.Round(7.5, MidpointRounding.AwayFromZero); // result:8
Math.Round(8.5, MidpointRounding.AwayFromZero); // result:9
Math.Round(9.5, MidpointRounding.AwayFromZero); // result:10
但是悲剧的是,如果用这个计算小数的话,就不灵了!!!
必须用第七个重载方法,
decimal Round(decimal d, int decimals, MidpointRounding mode)
这样计算出来的小数才是真正的中国式四舍五入!!
Math.Round(526.925, 2)
526.92
Math.Round(526.925, 2,MidpointRounding.AwayFromZero)
526.92
Math.Round((decimal)526.925, 2)
526.92
Math.Round((decimal)526.925, 2,MidpointRounding.AwayFromZero)
526.93