В SQL Server 2008 у меня есть значение «0,01» в атрибуте XML. Используя OPENXML, я уничтожил XML во временную таблицу. Если применимый столбец имеет тип real (одинарная точность), в таблице он равен 0,01. Хорошо. Однако, если точность равна float (двойная точность), она получается как 0,00999999977648258. Это не имеет никакого смысла. Почему он это делает?
Мой следующий вопрос: независимо от того, как значение представлено во временной таблице, когда я запускаю на нем статистическую функцию, оно всегда возвращается как 0,00999999977648258. Это приводит к ошибкам проверки: процедура сообщает, что ввод слишком мал (<0,01), что не соответствует действительности. </p>
Есть идеи, почему возникают ошибки округления и как их преодолеть?
Уже пробовал: сделать колонку варчаром.
EDIT2:
Основываясь на ответах, я понимаю, что проблема заключается в том, что числа IEEE не могут точно представлять 0,01. Поэтому мой следующий вопрос:
"ГДЕ {вычислено} <0,01", почему это
0,01 также не округляется здесь? Если бы это было так, уравнение выглядело бы как
ожидается (то есть 0.00999999977648258 является
не <0,00999999977648258) </p>
РЕДАКТИРОВАТЬ: показан пример кода
Этот код выдаст ошибку. Измените значение с плавающей точкой на реальное, и ошибка «исчезнет» По крайней мере, до временной таблицы.
DECLARE @XMLText varchar(max)
SET @XMLText =
'<query prodType="1">
<param type="1" lowMin="10" hiMax="300">
<item low="18" hi="20" mode="1" weight="1" />
<item low="220" hi="220" mode="0" weight="1" />
</param>
<param type="2" lowMin="4" hiMax="6">
<item low="5" hi="5" mode="1" weight="1" />
<item low="6" hi="6" mode="0" weight="0.01" />
</param>
<param type="3" lowMin="0" hiMax="300">
<item low="34" hi="34" mode="1" weight="0.75" />
<item low="40" hi="60" mode="1" weight="0.25" />
</param>
</query>'
DECLARE @hxml int, @sp INT, @StartXCount int
EXEC sp_xml_preparedocument @hxml OUTPUT, @XMLText
IF @sp != 0 BEGIN
SET @Result = '0'
RETURN
END
DECLARE @t table (
LowMin real,
HiMax real,
ParamTypeID int,
ParamWeight float, -- real <<<
Low real,
Hi real,
Mode tinyint
)
INSERT INTO @t
SELECT *
FROM OPENXML (@hxml, '/query/param/item', 2)
WITH (
LowMin real '../@lowMin',
HiMax real '../@hiMax',
ParamTypeID int '../@type',
ParamWeight real '@weight',
Low real '@low',
Hi real '@hi',
Mode tinyint '@mode'
)
SELECT * FROM @t