使用Microsoft SQL Server 2008.我有一张利率表。我手动验证了我正在尝试选择的数据确实存在于表中。
这会返回记录:
SELECT *
FROM [MyTable]
WHERE [Rate]=3.99/100
这不会返回记录:
SELECT *
FROM [MyTable]
WHERE [Rate]*100=3.99
以下是真正混乱的部分:据我所知,这只发生在Rate字段包含.035
,.03625
或.0399
的值时。
谁能告诉我为什么第二个实例不起作用?此表具有ID字段(PK),Rate
字段为FLOAT
。如果您需要更多信息,请与我们联系。
答案 0 :(得分:8)
您应该使用十进制非浮点数来计算利率。 float
是不精确的,你发现了圆角错误!
在我的机器上
WITH [MyTable]([Rate])
AS (SELECT CAST(.0399 AS FLOAT))
SELECT [Rate] * 100,
CASE
WHEN [Rate] * 100 = 3.99 THEN 'Y' ELSE 'N'
END AS [= 3.99],
CASE
WHEN [Rate] * 100 > 3.989999999999999 THEN 'Y' ELSE 'N'
END AS [> 3.989999999999999],
CASE
WHEN [Rate] * 100 < 3.99 THEN 'Y' ELSE 'N'
END AS [< 3.99]
FROM [MyTable]
返回
= 3.99 > 3.989999999999999 < 3.99
---------------------- ------ ------------------- ------
3.99 N Y Y
强制性链接:What Every Computer Scientist Should Know About Floating-Point Arithmetic