我正在规范化数据库,其中一部分涉及将一个表中的列从FLOAT
转换为DECIMAL(28,18)
。当我尝试将此转换后的列连接回源列时,在某些情况下它不会返回任何结果。
它似乎与它转变的方式有关。例如,转换为FLOAT
的{{1}}会产生:
DECIMAL(28,18)
原始51.051643260000006000
是
FLOAT
我尝试了各种修改51.05164326
的方法,但这些方法都不起作用:
FLOAT
转换的原因是由于提高了这些字段的准确性。
有没有人有一个一致的策略来转换这些数字,并能够确保后续加入工作?
提前致谢
CM
答案 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
上的索引。
但是,加入小数是不常见的。除非你实际上需要加入它们或者需要进行直接的相等比较(而不是范围比较),否则可以更好地简单地进行转换,并记录下这样的事实:由于最初选择了不适当的数据类型,准确性会有很小的损失。
有关详细信息,请参阅: