在C#中将double转换为int

Wou*_*elo 86 c# double int

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

double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*Jon 135

因为Convert.ToInt32轮次:

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

...当演员截断时:

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

更新:请参阅下面的Jeppe Stig Nielsen的评论,了解其他差异(但如果这score是一个实数,则不会发挥作用).

  • 你的链接实际上解释得最好,它不像round和truncate那么简单:输入:System.Int32值,四舍五入到最接近的32位有符号整数.如果值在两个整数之间,则返回偶数; 也就是说,4.5转换为4,5.5转换为6. (6认同)
  • 如果`score`是'NaN`或无穷大或有限但超出`Int32`的范围,则`Convert.ToInt32`将抛出异常.Cast将返回一个`int`,但你不知道哪一个(在我的实现中它是`Int32.MinValue`),因为你在`unchecked`上下文.(如果您处于`checked`上下文中,演员也将在这些情况下抛出异常.) (5认同)

nei*_*acy 12

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

Convert.ToInt32(8.6) 是确保你的double四舍五入到最接近的整数的安全方法,在这种情况下为9.


Dav*_*vid 11

你可以围绕你的双倍和铸造ist:

(int)Math.Round(myDouble);
Run Code Online (Sandbox Code Playgroud)

  • 现在的问题是如何使“ i1 == i2”。问题是**为什么**不相等。不赞成投票。 (2认同)

Evd*_*afa 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
Run Code Online (Sandbox Code Playgroud)