从浮点数中得到int的正确方法是什么?

本文关键字:方法 是什么 int 浮点数 | 更新日期: 2023-09-27 18:03:27

我遇到了一个问题,我想我有解决方案,但找不到任何人告诉我,如果我是对的还是错的?请看下面的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;
}

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

从浮点数中得到int的正确方法是什么?

第二个选项是正确的。

首先,通过将值强制转换为最初被装箱的确切类型(即float)来拆箱。
然后将float转换为int

由于盒装值的类型是float,您需要首先将其强制转换为float,因为它需要打开盒装:

int newNumber = (int)(float)myObj;

如果你想知道double强制转换的原因,可以从这些问题中找到更多的信息:

  • 转换盒装值
  • 为什么我得到InvalidCastException?

让我们各试一下…

//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.

当您有这样一个盒装数字值并希望通过强制转换来转换它时,您必须首先将其强制转换为精确的类型(在本例中为float),然后再将其转换为兼容的类型(在本例中为int)。

如果你事先不知道它是float,但你知道它可以转换为int,你应该使用Convert.ToInt32,无论myObjfloat, double等,它都可以工作。

int newNumber = Convert.ToInt32(myObj);

根据你的测试,你不知道框值的类型,然后我将避免任何双类型转换(因为对于第一个你总是需要知道确切的类型)。

有一个类来处理转换,让我们试着使用它:

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

实际上这和普通类型转换很不一样,它会执行如下操作:

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

差异在于舍入的执行方式。强制转换将截断你的数字(因此1.7将变成1),而转换将执行四舍五入(因此1.7将变成2)。

如果你知道它是一个浮点数(但你不知道如果doublefloat),那么我建议先转换为double,然后强制转换:

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