代码之家  ›  专栏  ›  技术社区  ›  Keith Sirmons

为什么SQL浮点数不同于C浮点数?

  •  40
  • Keith Sirmons  · 技术社区  · 16 年前

    你好,我从数据集的数据表中提取了一个数据行。我正在访问在SQL中定义为float数据类型的列。我正在尝试将该值赋给局部变量(C float数据类型),但得到的却是一个invalidCastXection

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

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

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

    有人能解释一下我在这里遗漏了什么吗?

    6 回复  |  直到 9 年前
        1
  •  69
  •   Austin Salonen gmlacrosse    16 年前
        2
  •  24
  •   bdukes Jon Skeet    16 年前

    SQL中的浮点是 Double 在clr(c/vb)中。有 a table of SQL data types with the CLR equivalents 在MSDN上。

        3
  •  2
  •   pdavis    16 年前

    Microsoft SQL Server中的float相当于c_中的double。原因是一个浮点数只能近似于一个十进制数, 精度 浮点数的大小决定了浮点数的精度 近似 十进制数。double类型表示双精度64位浮点数,其值范围为负1.79769313486232E308到正1.79769313486232E308,以及正或负零、正无穷大、负无穷大和非数字(NaN)。

        4
  •  2
  •   HLGEM    10 年前

    通常,如果您计划对数据执行数学计算,就不会希望在SQL Server中使用float(或real),因为它是一个不精确的数据类型,并且会导致计算错误。如果需要精度,请改用decimal数据类型。

        5
  •  0
  •   David Bridge    9 年前

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

    _加速限制=(浮动)(双)练习[“默认加速限制”];

    这个“工作”的原因和它“感觉不正确”的原因是您正在通过第二个转换(左边的转换)将double降级为float,因此您将失去精度,并有效地告诉编译器截断返回的值是可以的。

    换句话说,这一行说明… 获取一个对象(在本例中正好包含一个双精度对象) 将对象强制转换为double(丢失所有对象包装) 将双精度球抛入一个浮球(失去双精度球的所有精密度)

    例如,如果值为 0.0124022806089461 你这样做,那么加速度极限值将是 零点零一二四零二二八

    因为这就是C中的浮点数可以从双精度值得到的范围。 这是一件危险的事情,我非常肯定这也是一个截断,而不是一个舍入,但有人可能想确认这一点,因为我不确定。

        6
  •  0
  •   dubrowgn    9 年前

    它“感觉不对劲”的原因是因为C使用相同的语法 拆箱 为了 铸造 这是两个非常不同的东西。 exercise["DefaultAccelLimit"] 包含作为对象装箱的双精度值。 (double) 需要 拆箱 这个物体又变成了一个双星。这个 (float) 在那之前 铸件 双精度转换为浮点值。C不允许在同一操作中进行装箱和铸造,因此必须先解除装箱,然后再进行铸造。

    即使铸件是无损的,情况也是如此。如果一个浮点数作为一个要铸成双精度浮点的对象被装箱,您可以这样做: (double)(float)object_var .