麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

c#中的浮點型轉整形的舍取 四舍五入和銀行家舍入實現代碼

2020-01-24 03:42:09
字體:
來源:轉載
供稿:網友
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平臺也不例外。

其舍入法則是:
一個小數,當舍去位小于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。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91精品国产一区二区三区动漫 | 久久精品艹 | 国产精品自拍99 | 手机av在线电影 | wwwxxx免费视频 | 国产在线精品一区二区 | 午夜精品福利在线观看 | av电影直播| 日本在线播放一区二区三区 | 国产98色在线 | 精品久久久久久久久久中文字幕 | 国产精品一品二区三区四区18 | 久草在线观看福利视频 | 久久久久久久久久久国产精品 | 911视频免费版 | 黄色高清视频网站 | 欧美日韩在线播放 | 日本综合久久 | 亚洲影视中文字幕 | 国产呦在线观看视频 | 98国内自拍在线视频 | 成人福利在线播放 | 1级黄色毛片 | 欧美日韩影视 | 色交视频| 羞羞视频.www在线观看 | 黄网站在线观 | 狠狠干夜夜草 | 亚洲国产精品二区 | a一级黄色大片 | 久久久久se| 日韩色视频在线观看 | 久久99综合久久爱伊人 | 在线观看中文字幕av | 一区二区三区四区高清视频 | 免费黄色欧美视频 | 日本不卡一二三区 | 久草最新网址 | 一区二区三区在线观看视频 | 日韩精品中文字幕一区二区三区 | 视频一区二区三区视频 |