MS SQL Float十进制比较问题

时间:2012-04-26 08:50:12

标签: tsql comparison decimal

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

它似乎与它转变的方式有关。例如,转换为FLOAT的{​​{1}}会产生:

DECIMAL(28,18)

原始51.051643260000006000

FLOAT

我尝试了各种修改51.05164326 的方法,但这些方法都不起作用:

FLOAT

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

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

提前致谢

CM

1 个答案:

答案 0 :(得分: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

如果双重播放是用于创建decimalColumn相同双重播放,则可以使用decimalColumn上的索引。< / p>

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

ON floatColumn > decimalColumn - @epsilon  AND floatColumn < decimalColumn + @epsilon

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

但是,加入小数是不常见的。除非你实际上需要加入它们或者需要进行直接的相等比较(而不是范围比较),否则可以更好地简单地进行转换,并记录下这样的事实:由于最初选择了不适当的数据类型,准确性会有很小的损失。

有关详细信息,请参阅: