我正在规范化数据库,其中一部分涉及将来自 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
上的索引.但是,以小数形式加入是不常见的。除非您确实需要加入它们或需要进行直接的相等比较(而不是范围比较),否则最好按原样进行转换,并记录准确性略有下降的事实由于最初选择了不合适的数据类型。
有关更多信息,请参阅:
关于tsql - MS SQL 浮点十进制比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330087/