2010-06-11 54 views
3

我明白在比較花車的問題主機,並哀嘆他們在這種情況下使用 - 但我不是表作者,只有一個小障礙攀登...TSQL - 使字面浮點值

有人已經決定使用浮點數,因爲你期望使用GUID。我需要檢索具有特定浮點值的所有記錄。

sp_help MyTable 

-- Column_name Type Computed Length Prec 
-- RandomGrouping float no 8 53 

這是我天真的嘗試:

--yields no results 
SELECT RandomGrouping 
FROM MyTable 
WHERE RandomGrouping = 0.867153569942739 

這裏是一個大約工作嘗試:

--yields 2 records 
SELECT RandomGrouping 
FROM MyTable 
WHERE RandomGrouping BETWEEN 0.867153569942739 - 0.00000001 
     AND 0.867153569942739 + 0.00000001 

-- 0.867153569942739 
-- 0.867153569942739 

在我天真的嘗試,是字面浮點文字?或者它確實是一個十進制文字,稍後會被轉換?

如果我的文字不是浮點文字,那麼創建浮點文字的語法是什麼?

編輯:我發生了另一種可能性......它可能是一個比顯示更精確的數字存儲在這一列。創建代表這個數字的文字可能是不可能的。我會接受證明情況如此的答案。


編輯:對DVK的響應。

TSQL是MSSQLServer的SQL方言。

這個腳本工作,所以可以確定性浮點類型之間進行平等:

DECLARE @X float 
SELECT top 1 @X = RandomGrouping 
FROM MyTable 
WHERE RandomGrouping BETWEEN 0.839110948199148 - 0.000000000001 
    AND 0.839110948199148 + 0.000000000001 
    --yields two records 
SELECT * 
FROM MyTable 
WHERE RandomGrouping = @X 

我說:「大約」,因爲一定範圍的方法測試。用這種方法,我可以得到不等於我預期值的值。

鏈接的文章不適用,因爲我不是(故意)試圖跨越小數和浮點之間的世界邊界。我正在嘗試僅使用花車。這不是關於小數不可兌換爲浮點數的問題。


響應Zinglon:

字面值,可以找到我的記錄,謝謝。

DECLARE @Y binary(8) 
SET @Y = 0x3FEAD9FF34076378 

SELECT * 
FROM MyTable 
WHERE convert(binary(8), RandomGrouping) = @Y 

回答

1

有可能顯示值正在被截斷。我假設專欄沒有獨特的約束,否則這個問題是沒有意義的。在我的設置中,SSMS截斷了此腳本中更精確的值。

create table flt (f float not null primary key) 
insert into flt 
select 0.111111111111111 
union all 
select 0.1111111111111111 
select f, cast(f as binary(8)) from flt 

同樣,如果這些值是不同的,你可以將它們轉換成二進制(8),並確定它們基於該值,如:

select f from flt 
where cast(f as binary(8)) = 0x3FBC71C71C71C71C 
0

問題不在於它是否是浮點數字。

問題是,在Sybase(或任何數據庫服務器)中比較兩個等式的浮點數是不確定的,因爲4.00000000000000000000 ...和3.99999999999999999999 ...是相同的確切數字,但不相等。

你的第二個解決方案是比較浮點「平等」的唯一正確方法(也就是說,它們是否與精度相同)。

爲什麼你說你的第二種方法「大​​約工作」?

既然你沒有提供你使用特定的數據庫服務器,這裏的問題的一個相當不錯的寫了(與基本與上述相同的結論)爲MySQL

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html