134

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

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

谁能解释我为什么i1 != i2

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

4

5 回答 5

205

因为Convert.ToInt32回合:

返回值:四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转换为4,5.5转换为6。

...而演员截断

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

更新:有关其他差异,请参阅下面的 Jeppe Stig Nielsen 的评论(但是,如果是实数,则不会发挥作用score,就像这里的情况一样)。

于 2012-05-25T12:17:30.817 回答
16

强制转换将忽略小数点后的任何内容,因此 8.6 变为 8。

Convert.ToInt32(8.6)是确保您的双精度数舍入到最接近的整数的安全方法,在本例中为 9。

于 2012-05-25T12:20:05.670 回答
11

你可以把你的替身和演员四舍五入:

(int)Math.Round(myDouble);
于 2012-05-25T12:20:04.000 回答
7

在提供的示例中,您的小数是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
于 2018-05-18T12:37:25.580 回答
1

ToInt32 轮。转换为 int 只会丢弃非整数部分。

于 2012-05-25T12:18:49.133 回答