4

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

这似乎与它的转换方式有关。例如, FLOAT转换为 aDECIMAL(28,18)会产生:

51.051643260000006000

原文FLOAT

51.05164326

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

CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000
STR(51.05164326 , 28,18) = 51.0516432599999990

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

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

提前致谢

厘米

4

1 回答 1

6

对于您的应用程序,您需要考虑需要多少个小数位。看起来实际上您需要大约 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.

但是,加入小数是不寻常的。除非您确实需要加入它们或需要进行直接相等比较(而不是范围比较),否则最好按您的原样进行转换,并记录准确性损失很小的事实由于最初选择了不合适的数据类型。

有关更多信息,请参阅:

于 2012-04-26T09:15:47.667 回答