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)
转换的原因是由于提高了这些字段的准确性.
有没有人有一个一致的策略来转换这些数字,并能够确保后续的连接工作?
提前致谢
厘米
对于您的应用程序,您需要考虑所需的小数位数.看起来实际上你需要大约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.
但是,加入小数是不常见的.除非您确实需要加入它们或需要进行直接相等比较(与范围比较相反),否则可以更好地简单地进行转换,并记录精度损失很小的事实由于最初选择了不适当的数据类型.
有关更多信息,请参阅
| 归档时间: |
|
| 查看次数: |
16302 次 |
| 最近记录: |