在我们的代码,我们有双重我们需要转换为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