From 轉換型別
sbyte short、int、long、float、double 或 decimal
byte short、ushort、int、uint、long、ulong、float、double 或 decimal
short int、long、float、double 或 decimal
ushort int、uint、long、ulong、float、double 或 decimal
int long、float、double 或 decimal
uint long、ulong、float、double 或 decimal
long float、double 或 decimal
ulong float、 double 或 decimal
char ushort、int、 uint、 long、ulong、 float、 double 或 decimal
float double
解說:隱含數值為系統能夠「自動」將上表數值轉換。先決條件是,由小轉大。
例如:int 轉 long,由於 int 範圍為 -2,147,483,648 到 2,147,483,647
long 範圍為-9,223,372,036,854,775,808 9,223,372,036,854,775,807
1.故我們可知道由 int 轉 long 是可以被系統默認轉換的。但若是轉浮點數如 double則可能會造成精準度的遺失,因為有小數點。不會有範圍遺失的問題。
2.不存在任何「數值」隱含轉換 到「char」的方式。請注意我說的是 隱含轉換
3.從 浮點型別(float、double)到 128位元的十進位值(decimal)沒有隱含轉換
4.如果常數運算式的值,在目的行別的範圍內,int 型別的常數運算式可以轉換成
sbyte、byte、short、ushort、uint 或 ulong。
例子:
//宣告型別
int height = 180 ;
int weight = 75 ;
//將 int 型別變數指派給其他變數(如 long,此為隱含轉換)
long h = height ;
long w = weight ;
根據上述,其餘型別亦可直接進行宣告做隱含轉換,請注意是否符合隱含轉換表即可。
明確轉換表
From 轉換型別
sbyte byte、ushort、uint、ulong 或 char
byte Sbyte 或 char
short sbyte、 byte、 ushort、 uint、 ulong 或 char
ushort sbyte、 byte、 short 或 char
int sbyte
byte、 short、 ushort、 uint、 ulong、 `` 或 char
uint sbyte、byte、 short、 ushort、 int 或 char
long sbyte、 byte、 short、 ushort、 int、 uint、 ulong 或 char。
ulong sbyte、 byte、 short、 ushort、 int、 uint、 long 或 char。
char sbyte、byte 或 short
float sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong、 char 或 decimal
double sbyte、byte、short、 ushort、 int、 uint、 long、 ulong、 char、 float 或 decimal
decimal sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong、 char、 float 或 double
解說:超過隱含數值表的範圍,隱含轉換可能無法自動完成轉換的工作,或自動轉換會有錯誤會精度上的誤差,為求正確需明確轉換。
1.不同型別需轉換才能做加減,否則會得到錯誤的答案。
2當decimal值轉換成「整數類型別時」,值會捨入小數點後的數字至零,成為最接近的整數值。如果產生的整數在型別範圍外,就會丟回OverflowException。
3.當 double 或 float 值轉換成「整數類型別」時,值會被截斷。如果產生的整數值超過目的值的範圍,則依據溢位檢查內容來決定結果。已檢查內容會丟出OverflowException。
4.當double 轉換成 float 時,double 會捨入為最接近的 float 值。如果double太小或太大,不適用目的型別,結果將會為零,或無限大。
5.當 float 轉換成 double 時,來源值會轉換為decimal表示,並捨入治罪接近第28位小數位置的數字(或需要的話)。根據來源值會發生兩種結果之一。
※來源值太小,無法以decimal表示,結果為零。
※來源值是NaN(非數字)、無限大或太大,以致無法以decimal表示時,就會丟回OverflowException。
6.當decimal 轉換成 float 或 double時,decimal值會捨入為最接近的 double 或 float 值。
3.當 double 或 float 值轉換成「整數類型別」時,值會被截斷。如果產生的整數值超過目的值的範圍,則依據溢位檢查內容來決定結果。已檢查內容會丟出OverflowException。
4.當double 轉換成 float 時,double 會捨入為最接近的 float 值。如果double太小或太大,不適用目的型別,結果將會為零,或無限大。
5.當 float 轉換成 double 時,來源值會轉換為decimal表示,並捨入治罪接近第28位小數位置的數字(或需要的話)。根據來源值會發生兩種結果之一。
※來源值太小,無法以decimal表示,結果為零。
※來源值是NaN(非數字)、無限大或太大,以致無法以decimal表示時,就會丟回OverflowException。
6.當decimal 轉換成 float 或 double時,decimal值會捨入為最接近的 double 或 float 值。
//宣告x,y為不同數值型別
float x = 10000.8f ;
double y = 9999.3d;
//明確將 float 及 double 轉換為 dcimal型別
Response.Write(" x - y = " + ((decimal)x - (decimal)y) + "<br/>");
Response.Write(" x * y = " + ((decimal)x * (decimal)y) + "<br/>");
從上面這個例子來看,我們可以得知若要明確轉換「值」,則可直接宣告。
萬用型別轉換指令 Convert
若遇到明確、隱含皆無法完成轉換的工作,可改用Convert 指令,只要型別間轉屬是合理的,大多都能完成。
用法:
Convert.ToDateTime 將值轉換為DateTime 。
Convert.ToDecimal 將值轉換為Decimal 。
Convert.ToInt16 將值轉換為16位元,帶正負號的整數。
簡單來說即是Convert.To後面加上你想轉換的型別,後面括號內放入宣告值。
如:Convert.Tostring(i) ;
例子:我想將 int 轉換成 string 的字串型別,但隱含及明確轉換都查不到。
--------(int轉換字串)--------
int i = 100 ;
string myString= (string)i ;
Reponse.Write(myString) ;
--------(字串轉換int)--------
string myString="100" ;
int i =(int)myString ;
Response.Write(i) ;
這樣寫則會失敗。
但若使用Convert,此問題可迎刃而解,字串亦同。
例子如下:
--------(int轉換字串)--------
int i = 100 ;
string myString=Convert.Tostring(i) ;
Response.Write(myString) ;
--------(字串轉換int)--------
string myString="100" ;
int i =Convert.ToInt32(myString) ;
Response.Write(i) ;
如此則可成功轉換
沒有留言:
張貼留言