2012-05-25 34 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