我理解比较浮点数时遇到的许多问题,并对它们在这种情况下的使用感到遗憾 - 但我不是表格作者,只有一个小障碍需要克服......
有人决定使用浮点数,就像您期望使用 GUID 一样。我需要检索具有特定浮点值的所有记录。
sp_help MyTable
-- Column_name Type Computed Length Prec
-- RandomGrouping float no 8 53
这是我天真的尝试:
--yields no results
SELECT RandomGrouping
FROM MyTable
WHERE RandomGrouping = 0.867153569942739
这是一个大概的工作尝试:
--yields 2 records
SELECT RandomGrouping
FROM MyTable
WHERE RandomGrouping BETWEEN 0.867153569942739 - 0.00000001
AND 0.867153569942739 + 0.00000001
-- 0.867153569942739
-- 0.867153569942739
在我天真的尝试中,该文字是浮点文字吗?或者它真的是稍后转换的十进制文字吗?
如果我的文字不是浮点文字,那么制作浮点文字的语法是什么?
编辑:我想到了另一种可能性......这可能是比显示的更精确的数字存储在该列中。创建代表该数字的文字可能是不可能的。我将接受证明情况确实如此的答案。
编辑:对 DVK 的回应。
TSQL 是 MSSQLServer 的 SQL 方言。
该脚本有效,因此可以在浮点类型之间确定性地执行相等性:
DECLARE @X float
SELECT top 1 @X = RandomGrouping
FROM MyTable
WHERE RandomGrouping BETWEEN 0.839110948199148 - 0.000000000001
AND 0.839110948199148 + 0.000000000001
--yields two records
SELECT *
FROM MyTable
WHERE RandomGrouping = @X
我说“大约”是因为该方法测试一个范围。通过这种方法,我可以获得不等于我的预期值的值。
链接的文章不适用,因为我没有(故意)尝试跨越十进制和浮点之间的世界界限。我正在尝试仅使用浮动。这与小数与浮点数的不可转换无关。
对Zinglon的回复:
可以找到我的记录的字面值,谢谢。
DECLARE @Y binary(8)
SET @Y = 0x3FEAD9FF34076378
SELECT *
FROM MyTable
WHERE convert(binary(8), RandomGrouping) = @Y