天天看點

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

c#