我理解在比较浮点数时存在的许多问题,并感叹它们在这种情况下的使用——但我不是表格作者,只有一个小障碍要爬......
有人决定使用浮点数,因为您希望使用 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
我说“大约”是因为该方法测试了一个范围。使用这种方法,我可以获得不等于我预期值的值。
链接的文章不适用,因为我没有(故意)试图跨越小数和浮点数之间的世界界限。我正在尝试只使用花车。这与小数不能转换为浮点数无关。
对辛隆的回应:
可以找到我的记录的文字值,谢谢。
DECLARE @Y binary(8)
SET @Y = 0x3FEAD9FF34076378
SELECT *
FROM MyTable
WHERE convert(binary(8), RandomGrouping) = @Y