在 C# 中将双精度转换为 int

本文关键字:转换 int 双精度 | 更新日期: 2023-09-27 18:35:16

在我们的代码中,我们有一个双精度值,我们需要将其转换为整数。

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

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

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

在 C# 中将双精度转换为 int

因为Convert.ToInt32轮:

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

。而演员们则剪裁:

从双精度值或浮点值转换为整型时, 值被截断。

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

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

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

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

(int)Math.Round(myDouble);

在提供的示例中,您的小数点是 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

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