【问题标题】:c# cast error (infinte value....what?)c# cast error (infinte value....what?)
【发布时间】:2012-01-15 17:42:50
【问题描述】:

可能我忽略了一些东西,但这个问题让我非常恼火。 我试图从数据集中获取一个值,然后用它来做一些计算。 在数据集中它被视为一个对象,所以我需要将它转换为 int 或 double。 出于某种原因,我遇到了一个愚蠢的错误,这让我很紧张。这是代码。

private void SpendsAnalysis()
    {
        float tempQty = 0;
        float tempPrice = 0;
        double tempTot = 0;
        double total = 0;

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            tempQty = (float)row.Cells["Qty"].Value;
            tempPrice = (float)row.Cells["Unit"].Value;

            tempTot = tempQty * tempPrice;
            total += tempTot;
        }

        textBox7.Text = total.ToString();
    }

抛出:“指定的演员表无效。” (System.InvalidCastException) 铸造数字时,必须小于无穷大。这是我得到的烦人的错误。现在我从我的数据集中获取数据,该数据集从存储过程中获取数据。 我相信“数量”字段类型是货币(是的,为什么是数量货币哈哈,而不是我的表格!)。在我的数据网格视图中,它看起来像 1.000,这是由于类型转换吗?我将如何纠正这个问题? 非常感谢!

【问题讨论】:

  • float 肯定比currencydecimal 更差。但你听起来应该是一个整数。在货币计算中出现的任何float/double 都是一个大危险信号。
  • 同意,但这些是原始表设置的值。我将其转换为我可以使用的值,双精度或浮点数
  • 为什么不Decimal?您可以在 C# 中使用小数点,这肯定是比floatdouble 这里更好的选择。

标签: c# winforms casting dataset


【解决方案1】:

类型转换必须成功,不幸的是,直接从object 转换为与底层对象不同的类型是行不通的,即使从decimal(@987654325 的 .NET 类型)转换也是如此@) 到 float 正常工作。

如果数据库中的类型是currency,我会试试这个:

= (float)(decimal)row.Cells["Qty"].Value;

或者,您可以使用this

= Convert.ToSingle(row.Cells["Qty"].Value);

它将查看实际值并确定要执行的正确转换类型。

为了回答您的评论,上述表达式涉及两种不同的转换:

  • object 到值类型的拆箱转换,在本例中为decimal
  • decimalfloat 的显式转换

第一个,拆箱转换,记录在 C# 语言规范第 4.3.2 节(这是C# 4.0 specification):

对不可空值类型的拆箱操作首先检查对象实例是否为给定不可空值类型的装箱值,然后复制该值退出实例。

(我的重点)

我也有规范的注释版本,Eric Lippert 将其总结为:

虽然将未装箱的 int 转换为未装箱的 double 是合法的,但将装箱的 int 转换为未装箱的 double 是不合法的——只能转换为未装箱的 int。

第二个,显式转换,记录在 C# 语言规范第 6.2.1 节中:

6.2.1 显式数字转换
显式数值转换是从数值类型到另一个数值类型的转换,其中隐式数值转换(第 6.1.2 节)尚不存在:
...
decimal 到 sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 double。

(再次强调)

总结一下:

  • 当从object“转换”为值类型时,实际上是对装箱的值进行拆箱,首先必须将实际基础值拆箱为正确的类型,然后才能将其转换为不同的类型输入。

【讨论】:

  • 啊,非常感谢 convert.tosingle 是一种享受,所以它是一个对象意味着它不能转换?还有这方面的信息吗?
  • 在回答中我想说的都说了,你确定你想要它是float而不是decimal吗?
  • yeh 现在变成了十进制,很好的解释。非常喜欢!
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 2021-02-21
  • 2018-09-29
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2022-12-02
  • 2022-12-02
相关资源
最近更新 更多