SQL 2008 Math在WHERE子句中失败

时间:2011-10-05 21:23:56

标签: sql sql-server-2008

使用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。如果您需要更多信息,请与我们联系。

1 个答案:

答案 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