2012-05-25 115 views
39

在我們的代碼,我們有雙重我們需要轉換爲int。轉換雙爲int在C#

double score = 8.6; 
int i1 = Convert.ToInt32(score); 
int i2 = (int)score; 

任何人都可以解釋我爲什麼i1 != i2

,我得到的結果是:i1 = 9i2 = 8

+3

'Math.Truncate(得分)'是更明確地表達意圖,而不是'(INT)score' – Lu55

回答

66

由於Convert.ToInt32回合:

返回值:四捨五入到最接近的32位帶符號整數。如果值 是兩個整數之間的中間值,則返回偶數; 即,4.5轉換爲4,和5.5被轉換爲6

...而鑄造truncates

當從雙或浮點數值轉換爲一體型, 值被截斷。

更新:下面見葉普斯蒂格·尼爾森的評論更多的差異(這可是不發揮作用,如果score是如這裏的情況下,實數)。

+3

您的鏈接其實最能解釋它,它不是圓形VS截斷一樣簡單:類型:System.Int32 值,四捨五入到最接近的32位有符號整數。如果值在兩個整數之間,則返回偶數;也就是說,4.5被轉換爲4,5.5被轉換爲6. – ericosg

+0

@ericosg:是的,如果'score'是'8.5'而不是'8.6',那將掩蓋差異。我更新了包含引號的答案。感謝您的意見。 – Jon

+2

如果'score'是'NaN'或者是一個無限或有限的但是在'Int32'的範圍之外,那麼'Convert.ToInt32'將會拋出一個異常。 Cast將返回一個'int',但是你不知道哪一個(在我的實現中它是'Int32.MinValue'),因爲你處於'unchecked'上下文中。 (如果你在'checked'背景下,中投將在這些情況下拋出一個異常,也是如此。) –

2

ToInt32輪。鑄造到int只是拋出非整數組件。

4

你可以圓你的雙人牀和投IST:

(int)Math.Round(myDouble); 
+0

現在的問題是**如何**使'i1 == i2'。問題是關於**爲什麼**他們不相等。 Downvoted。 – Adam

7

鑄造會忽略小數點後的任何東西,所以8.6變爲8

Convert.ToInt32(8.6)是確保你的雙安全方式被四捨五入到最接近的整數,在這種情況下,9

+1

獎勵問題 - 如果* double *的值太大而無法推入* int *,會發生什麼情況?即如果它高於* int.MAX_VAL *? –

+1

@KonradViltersten引發異常_Value對於Int32來說太大或太小了._ – Vamsi