从浮点数中获取int的正确方法是什么?

时间:2014-05-15 14:46:33

标签: c# .net casting type-conversion

我遇到了一个问题,我认为我有解决办法,但找不到任何人告诉我我是对还是错?请参阅以下C#中的示例:

public void Test(float number)
{
   object myObj = number;

  //Here is where I don't know what the correct way to do this is?
  // int newNumber = (int)myObj;
  // int newNumber = (int)(float)myObj;
 // int newNumber = (int)(double)myObj;
}

结果必须确保不会发生类型异常。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

第二种选择是正确的。

首先,您将unbox的价值投射到最初装箱的确切类型(即float)。{
然后,您将float转换为int

答案 1 :(得分:1)

由于盒装值的类型为float,因此您需要首先将其强制转换为float,因为它需要取消装箱:

int newNumber = (int)(float)myObj;

如果您想知道 double 施放的原因,您可以从这些问题中找到更多信息:

答案 2 :(得分:1)

我们试试吧......

//int newNumber = (int)myObj;
//InvalidCastException: Specified cast is not valid.

int newNumber = (int)(float)myObj; // works! newNumber is 2

//int newNumber = (int)(double)myObj;
//InvalidCastException: Specified cast is not valid.

如果你有这样的boxed numeric value并希望通过强制转换来转换它,则必须先将其转换为 exact 类型(在本例中为float),然后再转换它是兼容的类型(在这种情况下,int)。

如果您事先不知道它是float,但您确实知道它可以转换为int,那么您应该使用Convert.ToInt32,这将有效{ {1}}是myObjfloat

double

答案 3 :(得分:1)

根据您的测试,您不知道盒装值的类型,然后我避免任何双重投射(因为对于第一个,您总是需要要知道确切的类型)。

有一个类可以使用转换,让我们尝试使用它:

int number = Convert.ToInt32(myObj, null);

实际上,这与普通演员有很大的不同,它会执行以下操作:

int number = ((IConvertible)myObj).ToInt32(null);

区别在于如何执行舍入。 Cast将截断你的数字(因此1.7将变为1),而转换将执行舍入(因此1.7将变为2)。

如果你知道它是一个浮点数(但你不知道,如果doublefloat)那么我&# 39; d建议首先转换为double然后转换:

int number = (int)Convert.ToDouble(myObj, null);

另请参阅我对difference between casting and conversion的回答。