在 C # 中将 double 转换为 int

在我们的代码中,有一个 double 需要转换为 int。

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

有人能解释一下为什么是 i1 != i2吗?

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

241068 次浏览

因为 Convert.ToInt32轮:

返回值: 四舍五入到最接近的32位有符号整数 在两个整数之间,返回偶数; 也就是说,4.5被转换成4,5.5被转换成6。

而演员们:

当从 double 或 float 值转换为整数类型时,将 值被截断。

更新: 查看 Jeppe Stig Nielsen 在下面的评论了解更多的不同(但是如果 score是一个真实的数字,那么就不起作用了,就像这里的情况一样)。

转换为 int 只会丢弃非整数组件。

你可以绕过你的替身和演员名单:

(int)Math.Round(myDouble);

施法将忽略小数点后面的任何内容,所以8.6变成了8。

Convert.ToInt32(8.6)是确保将 double 四舍五入到最接近的整数(在本例中为9)的安全方法。

在提供的示例中,您的小数是 8.6。如果是8.5或9.5,那么 I1 = = i2的陈述可能是正确的。事实上,对于8.5是真的,对于9.5是假的。

解说:

不管第二个语句是小数部分还是小数部分,int i2 = (int)score都会丢弃小数部分,只返回整数部分。这样做很危险,因为数据可能会丢失。

现在,对于第一个声明,可能会发生两件事。如果小数部分是5,也就是说,它已经完成了一半,就要做出决定。我们是向上还是向下?在 C # 中,Convert 类实现了银行家舍入。有关更深入的解释,请参见 这个答案。简单地说,如果数字是偶数,向下舍入,如果数字是奇数,向上舍入。

例如:

        double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score;             // 8


score += 1;
i1 = Convert.ToInt32(score);     // 10
i2 = (int)score;                 // 9