VS编程,C#对于带小数的数据进行取整和四舍六入五取偶的简短说明

有时对于有小数位的数据要进行取整操作或者舍入操作,这里简短说一下实现方法。
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


版权声明:本文为weixin_45966328原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。