【问题标题】:What is the proper way to get an int from a float?从浮点数中获取 int 的正确方法是什么?
【发布时间】:2014-07-04 02:27:28
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net casting type-conversion


    【解决方案1】:

    第二个选项是正确的。

    首先,您 unbox 将您的值强制转换为最初装箱的确切类型(即 float)。
    然后将float 转换为int

    【讨论】:

      【解决方案2】:

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

      int newNumber = (int)(float)myObj;
      

      如果您想知道双重演员的原因,您可以从这些问题中找到更多信息:

      【讨论】:

      • 哦,我想这就是我感到困惑的地方。我想既然它最初是作为一个浮点对象开始的,并且一个浮点数可以转换为一个 int 我可以简单地做 (int)myObject.
      【解决方案3】:

      让我们尝试一下......

      //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 并希望通过强制转换对其进行转换时,您必须先将其强制转换为精确 类型(在本例中为float),然后才能将其转换为兼容的类型(在本例中为int)。

      如果您事先不知道它是float,但您知道它可以转换为int,您应该使用Convert.ToInt32,无论myObj 是@987654330,它都可以使用@、double

      int newNumber = Convert.ToInt32(myObj);
      

      【讨论】:

        【解决方案4】:

        根据您的测试,您不知道装箱值的类型,那么 我会避免任何双重转换(因为对于第一个您总是需要知道确切的类型强>)。

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

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

        实际上这与普通的强制转换有很大不同,它会执行如下操作:

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

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

        如果您知道这是一个浮点数(但您不知道double 还是float),那么我建议先转换为double 然后再转换:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-08
          • 2012-06-05
          • 1970-01-01
          相关资源
          最近更新 更多