你好,我从DataSet中拔出了DataTable。我正在访问一个在SQL中定义为float数据类型的列。我试图将该值分配给局部变量(c#float数据类型),但我得到一个InvalidCastExecption

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

现在,玩这个我确实让它工作但它没有任何意义,它感觉不对。

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

有谁可以解释我在这里缺少的东西?

有帮助吗?

其他提示

SQL中的float是CLR中的 Double (C#/ VB)。 MSDN上有 SQL数据类型表及CLR等效项

通常,如果您计划对数据执行数学计算,因为它是一种不精确的数据类型,并且会引入计算错误,您通常不会在SQL Server(或实际)中使用float。如果需要精度,请使用decimal数据类型。

Microsoft SQL Server中的float等效于C#中的Double。原因是浮点数只能近似一个十进制数,浮点数的精度决定了近似十进制数的准确程度。 Double类型表示双精度64位浮点数,其值范围从负1.79769313486232e308到正1.79769313486232e308,以及正或负零,PositiveInfinity,NegativeInfinity和Not-a-Number(NaN)。

我认为主要问题已在这里得到解答,但我觉得有必要在问题部分添加一些内容,说明这是有效的。

  

_AccelLimit =(float)(double)exercise [" DefaultAccelLimit"];

这个“工作”的原因以及它“感觉不对”的原因是你正在通过第二个演员(左边的那个)将double降级为float,这样你就失去了精度,并且有效地告诉编译器可以截断返回的值。

用这句话来说...... 获取一个对象(在这种情况下恰好保持一个双精度) 将对象转换为double(丢失所有对象包装) 将双精度转换为浮点数(失去双精度的所有精度)

e.g。如果值是说 0.0124022806089461 然后你执行上面的操作,然后AccelLimit的值将是 0.01240228

因为这是c#中的float可以从double值获得的范围。 这是一个危险的事情,我很确定它是一个截断而不是四舍五入,但有人可能想确认这一点,因为我不确定。

它“感觉不对”的原因是因为C#对拆箱转换使用相同的语法,这是两个非常不同的东西。 exercise [" DefaultAccelLimit"] 包含一个double值,作为对象加框。 (double)需要 unbox 将对象重新变为double。前面的(float)然后将double转换为一个浮点值。 C#不允许在同一操作中装箱和施放,因此你必须取消装箱,然后施放。

即使演员表是非破坏性的,情况也是如此。如果一个float被装箱作为你想要转换为double的对象,你可以这样做:(double)(float)object_var

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top