将double转换为int,是圆形还是仅剥离数字?

时间:2012-11-08 15:32:01

标签: c# casting int double rounding

使用双精度进行一些计算,然后需要将其强制转换为int。所以我有一个简单的问题,当将一个双重说7.5转换为int时,它将返回7。

这是小数点之后的四舍五入或只是条纹化的产物吗?

如果它是四舍五入的乘积,它是否是智能的,即0.1到0.5它向下舍入,0.6到0.9它向上舍入?

干杯

7 个答案:

答案 0 :(得分:33)

它不会舍入,只返回小数点前的整数部分。

参考(感谢Rawling):Explicit Numeric Conversions Table

您可以通过编写简单的测试来自己尝试这样的简单问题。以下测试(使用NUnit)将通过,因此可以回答您的问题:

[Test]
public void Cast_float_to_int_will_not_round_but_truncate
{
    var x = 3.9f;
    Assert.That((int)x == 3); // <-- This will pass
}

答案 1 :(得分:11)

不要因为假设四舍五入而被愚弄。它删除了十进制并纯粹返回double的整数部分。这对于负数是很重要的,因为从2.75向下舍入给出2,但从-2.75向下舍入给出-3。转换不向下舍入所以(int)2.75给出2,但(int)-2.75给出-2。

double positiveDouble = 2.75;
double negativeDouble = -2.75;

int positiveInteger = (int) positiveDouble;
int negativeInteger = (int) negativeDouble;

Console.WriteLine(positiveInteger + " = (int)" + positiveDouble);
Console.WriteLine(negativeInteger + " = (int)" + negativeDouble);

Console.ReadLine();

//Output: 2 = (int)2.75
//        -2 = (int)-2.75

答案 2 :(得分:8)

简单地施放只剥离小数点以外的所有内容。要向上或向下舍入,您可以使用Math.Round() method。这将向上或向下舍入,并提供如何在中途做什么的参数。您还可以使用Math.Floor()Math.Ceiling()方法在投射前隐式向上舍入或向下舍入。以下是一些例子:

double num1 = 3.5;
double num2 = 3.2;
double num3 = 3.9;

(int)num1 // returns 3;
(int)num2 // returns 3;
(int)num3 // returns 3 also;
(int)Math.Round(num1) // returns 4
(int)Math.Round(num2) // returns 3
(int)Math.Round(num3) // returns 4
(int)Math.Floor(num1) // returns 3
(int)Math.Floor(num2) // returns 3
(int)Math.Floor(num3) // returns 3
(int)Math.Ceiling(num1) // returns 4
(int)Math.Ceiling(num2) // returns 4;
(int)Math.Ceiling(num3) // returns 4;

答案 3 :(得分:4)

需要整数部分

double d = 0.9;
System.Console.WriteLine((int)d);

结果是0

答案 4 :(得分:0)

如果它返回7为7.5的两倍,那么它不会四舍五入,因为舍入规则将规定任何5及以上的数据都会向上舍入而不是向下舍入。

答案 5 :(得分:0)

来自C# Language Specification

  

unchecked上下文中,转换始终成功,并且   进展如下。

     

•如果操作数的值为NaN或无穷大,   转换的结果是未指定的值   目的地类型。

     

•否则,源操作数向四舍五入   零到最接近的整数值。如果这个积分值在   目的地类型的范围,然后这个值是的结果   转换。

     

•否则,转换结果为   未指定的目的地类型的值。

另请参阅MSDN上的Explicit Numeric Conversions Table — Remarks

答案 6 :(得分:0)

像这样的正常演员

int number;
double decimals = 7.8987;

number = (int)decimals;

将返回number = 7.这是因为它只是跳过最不重要的数字。如果你想让它正确地圆,你可以像这样使用 Math.Round()

number = (int)Math.Round(number);

这将返回数字= 8。