tsql - MS SQL 浮点十进制比较问题

标签 tsql comparison decimal

我正在规范化数据库,其中一部分涉及将来自 FLOAT 的表中的列转换到 DECIMAL(28,18) .然后,当我尝试将此转换后的列连接回源列时,在某些情况下它不会返回任何结果。

这似乎与它的转换方式有关。例如,FLOAT转换为 DECIMAL(28,18)产生:

51.051643260000006000

FLOAT
51.05164326

我尝试了各种修改 FLOAT 的方法,并且这些都不起作用:
CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000
STR(51.05164326 , 28,18) = 51.0516432599999990

转换的原因是由于提高了这些字段的准确性。

有没有人有一致的策略来转换这些数字,并能够确保后续的连接工作?

提前致谢

厘米

最佳答案

对于您的应用程序,您需要考虑您需要多少位小数。看起来实际上您需要大约 8-14 位小数而不是 18。

进行转换的一种方法是 cast(cast(floatColumn as decimal(28,14)) as decimal(28,18)) .

要在小数列和浮点列之间进行连接,您可以执行以下操作:

ON cast(cast(floatColumn as decimal(28,14)) as decimal(28,18)) = decimalColumn

如果双铸是 双铸用于创建 decimalColumn ,这将允许您使用 decimalColumn 上的索引.

或者,您可以使用范围连接:
ON floatColumn > decimalColumn - @epsilon  AND floatColumn < decimalColumn + @epsilon

这应该仍然使用 decimalColumn 上的索引.

但是,以小数形式加入是不常见的。除非您确实需要加入它们或需要进行直接的相等比较(而不是范围比较),否则最好按原样进行转换,并记录准确性略有下降的事实由于最初选择了不合适的数据类型。

有关更多信息,请参阅:
  • Is it correct to compare two rounded floating point numbers using the == operator?
  • Dealing with accuracy problems in floating-point numbers
  • 关于tsql - MS SQL 浮点十进制比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330087/

    相关文章:

    sql-server - 存储过程默认参数标识

    sql-server - 是否有一个 SQL 函数可以将固定宽度的分隔字符串拆分为一个表,每个值对应一行?

    python - 检查 Pandas 中另一列值中是否存在字符串的最有效方法

    java - 如何使用不同的比较器创建通用结构的两个实例?

    java - 比较 Java 中的状态

    javascript - 我可以在没有数学的情况下在 javascript 中移动小数点吗?

    sql - 如何通过特定顺序检测值的变化

    sql-server - 从表变量更新表

    Java 将分数输出为十进制程序

    vba - 使用VBA将十进制数转换为分钟和秒