MS SQL Float十进制比较问题

Cat*_*key 4 t-sql comparison decimal

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

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

51.051643260000006000
Run Code Online (Sandbox Code Playgroud)

原来FLOAT

51.05164326
Run Code Online (Sandbox Code Playgroud)

我尝试了各种修改方法FLOAT,但这些方法都没有:

CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000
STR(51.05164326 , 28,18) = 51.0516432599999990
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

厘米

Ben*_*Ben 5

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

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

要在decimal和float列之间进行连接,可以执行以下操作:

ON cast(cast(floatColumn as decimal(28,14)) as decimal(28,18)) = decimalColumn
Run Code Online (Sandbox Code Playgroud)

如果double-cast 用于创建的double-cast 相同decimalColumn,这将允许您使用索引decimalColumn.

或者,您可以使用范围连接:

ON floatColumn > decimalColumn - @epsilon  AND floatColumn < decimalColumn + @epsilon
Run Code Online (Sandbox Code Playgroud)

这应该仍然使用索引decimalColumn.

但是,加入小数是不常见的.除非您确实需要加入它们或需要进行直接相等比较(与范围比较相反),否则可以更好地简单地进行转换,并记录精度损失很小的事实由于最初选择了不适当的数据类型.

有关更多信息,请参阅