检查SUM在双精度列上的约束失败

时间:2015-01-26 20:51:22

标签: sql sql-server-2008-r2 sql-server-2012

我试图理解SQL Server 2008 R2中的CHECK约束失败(SQL Server 2012上也出现同样的问题)。

我的sql命令只是在两列上更新了126.3的数量,约束检查两列的总和是否与第三列匹配。

以下是重现问题的步骤:

CREATE TABLE FailedCheck ( item VARCHAR(10), qty_total DOUBLE PRECISION, qty_type1 DOUBLE PRECISION, qty_type2 DOUBLE PRECISION )
ALTER TABLE FailedCheck ADD CONSTRAINT TotalSum CHECK(qty_total = (qty_type1 + qty_type2));
INSERT INTO FailedCheck VALUES ('Item 2', 101.66, 91.44, 10.22);
UPDATE FailedCheck SET qty_total = qty_total + 126.3, qty_type1 = qty_type1 + 126.3

列qty_total必须包含(qty_type1和qty_type2)的总和。所有列都是'双精度'。如果我将值从126.3更改为126,它可以工作,我已经测试了其他值(int和double),并且无法理解为什么有时它会起作用,有时候也不会。

我的CHECK约束有什么问题?

PS:对不起我的英语,它不是我的主要语言。

1 个答案:

答案 0 :(得分:3)

您决定使用仅包含近似值的浮点数据类型 - 非常精确,但仅限于某种程度。 1.3可能存储为1.299999999999998或类似的东西。因此,91.44和10.22的近似值的总和恰好可能恰好是101.66的近似值,但也可能略有不同。

永远不要将浮点值与等号(=)进行比较。

最好不要首先使用浮选点类型,如果不是真的,真的需要。请改用DECIMAL。