SQL 2008 Math在WHERE子句中失败

Red*_*ish 3 sql sql-server-2008

使用Microsoft SQL Server 2008.我有一个利率表.我已手动验证我正在尝试选择的数据是否存在于表中.

这会返回记录:

SELECT *
  FROM [MyTable]
  WHERE [Rate]=3.99/100
Run Code Online (Sandbox Code Playgroud)

这不会返回记录:

SELECT *
  FROM [MyTable]
  WHERE [Rate]*100=3.99
Run Code Online (Sandbox Code Playgroud)

这里是真的搞砸了一部分:据我所知,在速率字段包含的值,这只是发生.035,.03625.0399.

任何人都可以告诉我为什么第二个实例不起作用?该表具有ID字段(PK),Rate字段为FLOAT.如果您需要更多信息,请与我们联系.

Mar*_*ith 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]  
Run Code Online (Sandbox Code Playgroud)

返回

                       = 3.99 > 3.989999999999999 < 3.99
---------------------- ------ ------------------- ------
3.99                   N      Y                   Y
Run Code Online (Sandbox Code Playgroud)

强制性链接:每个计算机科学家应该知道的浮点运算