32

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

这是四舍五入的产物还是只是小数点后的任何内容?

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

干杯

4

7 回答 7

50

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

参考(感谢Rawling显式数字转换表

当您将 double 或 float 值转换为整数类型时,该值会朝零舍入到最接近的整数值。

您可以通过编写简单的测试自己尝试这样的简单问题。以下测试(使用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
}
于 2012-11-08T15:33:40.807 回答
22

不要被假设它向下舍入而被愚弄。它去掉小数点并纯粹返回双精度的整数部分。这对于负数很重要,因为从 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
于 2012-11-08T15:42:03.687 回答
14

简单地投射只是去除小数点后的所有内容。要向上或向下舍入,您可以使用Math.Round() 方法。这将向上或向下舍入,并提供一个关于如果中途该怎么做的参数。您还可以使用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;
于 2012-11-08T15:37:35.933 回答
5

它需要整数部分

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

结果为 0

于 2012-11-08T15:34:37.507 回答
2

像这样的普通演员

int number;
double decimals = 7.8987;

number = (int)decimals;

将返回 number = 7。那是因为它只是跳过了最不重要的数字。如果您希望它正确舍入,您可以像这样使用Math.Round()

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

这将返回数字 = 8。

于 2012-11-08T15:52:55.073 回答
1

来自C# 语言规范

unchecked上下文中,转换总是成功的,并按如下方式进行。

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

• 否则,源操作数向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,那么这个值就是转换的结果。

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

另请参阅显式数字转换表 - MSDN 上的备注

于 2012-11-08T15:49:13.820 回答
0

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

于 2012-11-08T15:34:22.117 回答