Я понимаю множество проблем при сравнении поплавков и оплакиваю их использование в этом случае - но я не являюсь автором таблицы и у меня есть только небольшое препятствие для подъема ...
Кто-то решилиспользуйте float, так как вы ожидаете использовать 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 - это диалект SQL MSSQLServer.
Этот скрипт работает,и поэтому равенство может быть выполнено детерминистически между типами с плавающей точкой:
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