在 C# 中,我如何将对象转换为浮点数

In c# how i can convert from object to float

尝试将对象转换为浮点数时出现以下错误:

System.InvalidCastException: The cast specified is invalid.

menu[i].weight = (float)dataGridView1[j, i].Value;

您可以使用 float.TryParse 并将对象转换 ToString() 作为参数传递。请看下面。

object obj = 2.111;
float height;
if (float.TryParse(obj.ToString(), out height))
{
   //success
   Console.WriteLine(height);
}
else
{
    //failed
}

正如其他人在评论中所述,您正在转换的值并不是真正的 float - 但这可能会造成混淆,因为 它可能看起来像 a float - 这是一个可能的场景示例:

object maybeFloat = 1.25;  // looks like a float, but is actually a double!
float wontWork = (float)maybeFloat; 

上面的转换将失败,抛出一个 InvalidCastException - 因为实际存储的项目(在 C# 中技术上称为 boxed,在 structs,例如 intfloatdouble,以及自定义 struct 类型)是 double,而不是 float。有几个“修复”:

  • 存储一个浮点数:
object someFloat = 1.25f; // Notice the `f` after the number - that's a float!
float willWork = (float)someFloat;

...但这并不总是可能的 - 数据可能来自某些外部来源,例如数据库等。在这种情况下,float.Parse 来拯救:

object maybeFloat = 1.25; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // float.Parse requires a string, 
                                                     // hence the `.ToString()` call

如果对象包含一个实际上可解析为 float 数据类型的值,这将起作用。因此,上面的示例适用于将装箱的 double 解析为 float(注意,可能会发生一些数据丢失 - 不是在上面的示例中,但一般来说,因为 float 是一个较小的数据类型比 double)。如果存储的值是 string(顺便说一句,string 未装箱,因为它们是引用类型),这也将起作用。也许奇怪的是,仍然需要 .ToString() 调用 - 因为没有 隐式转换 objectstring:

object maybeFloat = "1.25"; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // no implicit conversion, 
                                                     // hence the `.ToString()` call

...但是如果存储的值真的、真的根本不是浮点数怎么办?好吧,然后 float.Parse 将失败,很可能会抛出 FormatException,表明提供的值实际上无法解析为 float 数据类型。您可以使用 try/catch 块捕获异常:

object maybeFloat = "one point two five"; // hmmm... that won't parse into a float!
float result = default;
try
{
   result = float.Parse(maybeFloat.ToString());
}
catch (FormatException _)
{
   // Handle error here!
}

...但是,还有更好的方法 - float.TryParse:

object maybeFloat = "one point two five"; // will fail to parse!
bool isSuccessfullyParsed = float.TryParse(maybeFloat.ToString(), out var result);

if (!isSuccessfullyParsed)
{
   // Handle error
}
else
{
   // `result` will contain the properly parsed float value
}

好的,这应该可以让您很好地了解您的具体情况。最后请注意,所有 .NET 数字类型都存在 .Parse.TryParse 方法 - intlongfloatdoubledecimal,甚至 BigInteger - 所以同样的技术适用于所有这些。