程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#中的浮點型轉整形的捨取-四捨五入和銀行家捨入

c#中的浮點型轉整形的捨取-四捨五入和銀行家捨入

編輯:C#入門知識

Double顯示轉換int
 
        static void Main(string[] args)
        {
            Console.WriteLine("5.1~{0}", (int)5.1d);
            Console.WriteLine("5.5~{0}", (int)5.5d);
            Console.WriteLine("5.8~{0}", (int)5.8d);
            Console.WriteLine("2.1~{0}", (int)2.1d);
            Console.WriteLine("2.5~{0}", (int)2.5d);
            Console.WriteLine("2.8~{0}", (int)2.8d);
            Console.WriteLine("-18.2~{0}", (int)-18.2f);
            Console.WriteLine("-18.5~{0}", (int)-18.5f);
            Console.WriteLine("-18.9~{0}", (int)-18.9f);
            Console.Read();
        }


  \

 

這裡可以看出浮點類型顯示轉換為整形是去除後面的小數,只取整數部分。
MSDN上是這樣解釋的:使用顯式轉換在 C# 中執行同一轉換時,小數點右邊的值將丟失。
這裡嘗試了double和float類型,結果和上面一樣!
 
 
難道四捨五入錯了?Convert.ToInt32

 
static void Main(string[] args)
        {
            Console.WriteLine("5.1~{0}", Convert.ToInt32(5.1d));
            Console.WriteLine("5.5~{0}", Convert.ToInt32(5.5d));
            Console.WriteLine("5.8~{0}", Convert.ToInt32(5.8d));
            Console.WriteLine("2.1~{0}", Convert.ToInt32(2.1d));
            Console.WriteLine("2.5~{0}", Convert.ToInt32(2.5d));
            Console.WriteLine("2.8~{0}", Convert.ToInt32(2.8d));
            Console.WriteLine("-18.2~{0}", Convert.ToInt32(-18.2f));
            Console.WriteLine("-18.5~{0}", Convert.ToInt32(-18.5f));
            Console.WriteLine("-18.9~{0}", Convert.ToInt32(-18.9f));
            Console.Read();
        }

  \

 

從上面的結果發現,2.5,-18.5沒有遵守我們從小學習的四捨五入的法則!但是5.5卻正確的轉換成了6。5.1,2.8這些都是正常按照四
捨五入的法則。
 
 
銀行家捨入法
 

MSDN下Convert.ToInt32方法
public static int ToInt32(decimal value);
public static int ToInt32(double value);
public static int ToInt32(float value);
 
Msdn對這些方法的返回都特殊說明了:
捨入為最接近的 32 位有符號整數的 value。如果 value 為兩個整數中間的數字,則返回二者中的偶數;即 4.5 轉換為 4,而 5.5 轉換為 6。
 
查閱相關資料,得出這個捨入的規則叫銀行家捨入法:
銀行家捨入是IEEE規定的小數捨入標准之一,也是IEEE目前規定中最優秀的捨入方法,因此所有符合 IEEE 標准的語言都應該實現這種算法,.NET平台也不例外。www.2cto.com
 
 
其捨入法則是:
一個小數,當捨去位小於5,那麼就捨去這位。
 
 
當捨去位等於5的時候,那麼去看捨去位前面一位數的奇偶性,如果是奇數,那麼就捨去5,然後捨去位前面一位加1,相反:如果是偶數,那麼就捨去5,捨去位保留偶數性質不變。
 
 
當捨去位大於5的時候,那麼捨去位不要,捨去位前面一位加1。
 
 
這個法則對負數也起相同作用!
 
例子:
4.3==4
4.5==4
5.5==6
6.5==6
 
 
NET中的銀行家捨入法實現

 
public static int ToInt32(double value)
{
    if (value >= 0.0)
    {
        if (value < 2147483647.5)
        {
            int num = (int)value;
            double num2 = value - num;
            if ((num2 > 0.5) || ((num2 == 0.5) && ((num & 1) != 0)))
            {
                num++;
            }
            return num;
        }
    }
    else if (value >= -2147483648.5)
    {
        int num3 = (int)value;
        double num4 = value - num3;
        if ((num4 < -0.5) || ((num4 == -0.5) && ((num3 & 1) != 0)))
        {
            num3--;
        }
        return num3;
    }
    throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
}


查看上面的代碼,可以從幾個地方發現復合銀行家捨入法
 
int num = (int)value;
double num2 = value - num;
if ((num2 > 0.5) || ((num2 == 0.5) && ((num & 1) != 0)))
{
   num++;
}
return num;
 
分析可以發現,先是顯示把value去掉小數轉換成num,然後獲取value和num之間的小數差,再根據銀行家法則來捨去。
((num2 == 0.5) && ((num & 1) != 0))
如果捨去位等於0.5,而且通過位運算得到是否是奇數,如果2個條件都符合,那麼就+1。否則返回num。

 

摘自 海不是藍  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved