在 SQL Server 2008 中,我在 XML 属性中有值“0.01”。使用 OPENXML,我将 XML 分解成一个临时表。如果适用列的类型为 real(单精度),则在表中显示为 0.01。好的。但是,如果精度是浮点数(双精度),则结果为 0.00999999977648258。这是没有意义的。为什么要这样做?
我的下一个问题是,无论临时表中的值如何表示,当我对其运行聚合函数时,它总是返回为 0.00999999977648258。这会导致验证错误:程序报告输入太小(< 0.01),这是不正确的。
任何想法为什么会发生这些舍入错误以及如何克服它们?
已经尝试过:使列成为 varchar。
编辑2:
根据答案,我理解问题是由于 IEEE 数字不能准确表示 0.01。因此我的下一个问题:
“WHERE {computed} < 0.01”,为什么 0.01 也没有在这里四舍五入?如果是,方程将按预期计算(即 0.00999999977648258 不小于 0.00999999977648258)
编辑:显示的示例代码
此代码将产生错误。将指示的浮点数更改为实数,错误“消失”。至少就临时表而言。
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