2011-10-05 31 views
3

使用Microsoft SQL Server 2008.我有一個利率表。我手動驗證了我想要選擇的數據確實存在於表格中。SQL 2008數學在WHERE子句中失敗

這將返回記錄:

SELECT * 
    FROM [MyTable] 
    WHERE [Rate]=3.99/100 

這不返回記錄:

SELECT * 
    FROM [MyTable] 
    WHERE [Rate]*100=3.99 

這裏是真的搞砸了一部分:據我所知,在速率字段包含這只是發生值爲.035,.03625.0399

誰能告訴我爲什麼第二個實例不工作?該表具有ID字段(PK),而Rate字段爲FLOAT。如果您需要更多信息,請告訴我。

回答

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

+0

我仍然博士學位軸承的開發工作,誰也無法理解什麼FLOAT *是* *是不是*適用於。 – MatBailie

+1

當然你是對的。當然,我現在正在踢自己。我甚至在這裏碰到它(如果其他人正在尋找):http://msdn.microsoft.com/en-us/library/ms187912.aspx 謝謝,祝你有美好的一天! –