在我們的代碼,我們有雙重我們需要轉換爲int。轉換雙爲int在C#
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
任何人都可以解釋我爲什麼i1 != i2
?
,我得到的結果是:i1 = 9
和i2 = 8
。
在我們的代碼,我們有雙重我們需要轉換爲int。轉換雙爲int在C#
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
任何人都可以解釋我爲什麼i1 != i2
?
,我得到的結果是:i1 = 9
和i2 = 8
。
由於Convert.ToInt32
回合:
返回值:四捨五入到最接近的32位帶符號整數。如果值 是兩個整數之間的中間值,則返回偶數; 即,4.5轉換爲4,和5.5被轉換爲6
...而鑄造truncates:
當從雙或浮點數值轉換爲一體型, 值被截斷。
更新:下面見葉普斯蒂格·尼爾森的評論更多的差異(這可是不發揮作用,如果score
是如這裏的情況下,實數)。
您的鏈接其實最能解釋它,它不是圓形VS截斷一樣簡單:類型:System.Int32 值,四捨五入到最接近的32位有符號整數。如果值在兩個整數之間,則返回偶數;也就是說,4.5被轉換爲4,5.5被轉換爲6. – ericosg
@ericosg:是的,如果'score'是'8.5'而不是'8.6',那將掩蓋差異。我更新了包含引號的答案。感謝您的意見。 – Jon
如果'score'是'NaN'或者是一個無限或有限的但是在'Int32'的範圍之外,那麼'Convert.ToInt32'將會拋出一個異常。 Cast將返回一個'int',但是你不知道哪一個(在我的實現中它是'Int32.MinValue'),因爲你處於'unchecked'上下文中。 (如果你在'checked'背景下,中投將在這些情況下拋出一個異常,也是如此。) –
ToInt32輪。鑄造到int只是拋出非整數組件。
你可以圓你的雙人牀和投IST:
(int)Math.Round(myDouble);
現在的問題是**如何**使'i1 == i2'。問題是關於**爲什麼**他們不相等。 Downvoted。 – Adam
鑄造會忽略小數點後的任何東西,所以8.6變爲8
Convert.ToInt32(8.6)
是確保你的雙安全方式被四捨五入到最接近的整數,在這種情況下,9
獎勵問題 - 如果* double *的值太大而無法推入* int *,會發生什麼情況?即如果它高於* int.MAX_VAL *? –
@KonradViltersten引發異常_Value對於Int32來說太大或太小了._ – Vamsi
'Math.Truncate(得分)'是更明確地表達意圖,而不是'(INT)score' – Lu55