2010年11月30日

C#四捨五入、無條件進位、捨去小數

以下介紹C#的四捨五入、無條件進位、捨去小數如何做:


命名空間: System
1. Math.Round():四捨六入五前去偶(銀行家進位)
這是IEEE的規格, 機率而言這樣比較公平,其規則如下:
小數>5:進位
小數<5:捨去
小數=5: 看前一位, 偶數捨去, 奇數進位

ex:Math.Round(1.2) ==>1.0
ex:Math.Round(1.6) ==>2.0
ex:Math.Round(1.5) ==>2.0
ex:Math.Round(2.5) ==>2.0

2. 傳統四捨五入, 就是小數>=5進位, 小數<5捨去。
a.若僅要顯示文字可用以下方式:

decimal aa=1.25m;
Console.Write(aa.ToString("#.#")); //1.2
decimal aa=1.15m;
Console.Write(aa.ToString("#.#")); //1.2
decimal aa=1.16m;
Console.Write(aa.ToString("#.#")); //1.2
decimal aa=1.14m;
Console.Write(aa.ToString("#.#")); //1.1


b.使用truncate

decimal a = 8.335m, b = 8.345m;
Console.WriteLine(decimal.Truncate(a * 100 + 0.5m) / 100); //8.34
Console.WriteLine(decimal.Truncate(b * 100 + 0.5m) / 100); //8.35
decimal c = -8.335m, d = -8.345m;
Console.WriteLine(decimal.Truncate(c * 100 - 0.5m) / 100); //8.34
Console.WriteLine(decimal.Truncate(d * 100 - 0.5m) / 100); //8.35
Console.WriteLine();


參考:
http://baike.baidu.com/view/370559.htm

c. 使用MidpointRounding.AwayFromZero,.NET 2.0以上 
被四捨五入的數字比需要是decimal型態,在數字後加上m,因為浮點數因為精確度的關係,不會照你想像的進位(Update)

Console.WriteLine("3.44: {0}", Math.Round(3.44m, 1,
MidpointRounding.AwayFromZero)); //3.4
Console.WriteLine("3.451: {0}", Math.Round(3.451m, 1,
MidpointRounding.AwayFromZero)); // 3.5
Console.WriteLine("3.45: {0}", Math.Round(3.45m, 1,
MidpointRounding.AwayFromZero)); //3.5.  
Console.WriteLine("3.75: {0}", Math.Round(3.75m, 1,
MidpointRounding.AwayFromZero));  //3.8 
Console.WriteLine("3.46: {0}", Math.Round(3.46m, 1,
MidpointRounding.AwayFromZero));


參考:
http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx

3. Math.Floor() 捨去小數。
ex:Math.Floor(1.2) ==>1.0
參考: http://msdn2.microsoft.com/zh-cn/library/k7ycc7xh(VS.80).aspx 
4.Math.Ceiling() 無條件進位。
ex:Math.Ceiling(1.2) ==>2.0
參考: http://msdn2.microsoft.com/zh-cn/library/system.math.ceiling(VS.80).aspx


延伸閱讀:
  TSQL
  Floor: 地板
  Ceiling: 天花板



 

4 則留言:

  1. Thank you very much.
    All I need is the "#" symbol

    回覆刪除
  2. 小數=5: 看前一位, 偶數捨去, 奇數進位...
    try 看看 2.135 及 3.135 二個是不同的哦(前一位都是奇數)
    用 Math.Round(value, 2, MidpointRounding.AwayFromZero)
    分別傳回 2.13 及 3.14

    回覆刪除
  3. 在某些數值下, 浮點數在四捨五入會有出乎意料的值,範例已更正為Decimal, 會比較精確

    回覆刪除