2012-03-19 23 views
4

我有一個表將字段的數據類型設置爲float。給定記錄集的值應該給出1的總和,並且select中的字段返回1,然而,HAVING子句另有說明。SQL Server浮點數的總和應爲1,但過濾器的值爲0

下面是我在表格中的確切值,正如你所看到的,這個例子也是一樣的。爲什麼總和超過1?我搞不清楚了!

with example as (
    SELECT 'Code' as Code, cast(0.462 as float) as perc 
    UNION ALL 
    SELECT 'Code' as Code, cast(0.116 as float) as perc 
    UNION ALL 
    SELECT 'Code' as Code, cast(0.181 as float) as perc 
    UNION ALL 
    SELECT 'Code' as Code, cast(0.053 as float) as perc 
    UNION ALL 
    SELECT 'Code' as Code, cast(0.188 as float) as perc 
) 

SELECT 
    Code, 
    SUM(perc) 
FROM 
    example 
GROUP BY Code 
HAVING SUM(perc) > 1 
+1

你使用'float'而不是'decimal'的任何原因?浮點數字會帶來這種問題。請參閱[浮點趣味](http://blogs.msdn.com/b/khen1234/archive/2005/05/13/417153.aspx) – 2012-03-19 20:26:21

+1

*'這裏是我的表格中的確切值'* - 這就是你錯了的地方:只要你將它們轉換成「浮動」或「真實」,它們就會停止準確。 – 2012-03-19 20:33:30

+0

謝謝大家。你的迴應很有啓發。德姆斯,那根本不是光顧的。我讀了更多關於這個主題並且現在理解它。謝謝 – 2012-03-23 01:24:08

回答

8

我想你錯明白浮動。我不是那種用光顧的方式,不幸的是,大多數人都誤解花車。

浮點數字能夠自我「重新縮放」。能夠保存大量數字或小數字,全部使用相同的數據類型。這並不意味着他們「無限精確」。這隻意味着他們有一個可以涵蓋的極端範圍。但是,他們確實爲這種靈活性付出了代價。由於它們是十進制數的二進制近似值,因此它們有舍入誤差。

如果你想知道更多關於它的信息,網上有很多。一開始,它會讓人們頭腦混亂,但一旦你明白你會更好,更安全,更明智。


所以,你的情況下,如果你想保留的確切值,不要使用浮點數據類型。改爲使用固定點數據類型。

如果你從FLOAT更改爲DECIMAL(9,4)之類的東西,那麼你將不會得到與浮點數相關的舍入誤差。

雖然您將無法在其中存儲0.12345,但您需要爲此指定DECIMAL(9,5)。但是您將始終保證您可以存儲的任何號碼都將完全保存,而不是大約。

+0

謝謝大家。你的迴應很有啓發。德姆斯,那根本不是光顧的。我讀了更多關於這個主題並且現在理解它。謝謝 – 2012-03-23 01:23:01

3

由於FLOAT它不是精確的數字類型,所以有浮點近似值。嘗試使用DECIMALNUMERIC

with example as (
SELECT 'Code' as Code, cast(0.462 as NUMERIC(5,3)) as perc 
UNION ALL 
SELECT 'Code' as Code, cast(0.116 as NUMERIC(5,3)) as perc 
UNION ALL 
SELECT 'Code' as Code, cast(0.181 as NUMERIC(5,3)) as perc 
UNION ALL 
SELECT 'Code' as Code, cast(0.053 as NUMERIC(5,3)) as perc 
UNION ALL 
SELECT 'Code' as Code, cast(0.188 as NUMERIC(5,3)) as perc 
) 

SELECT 
    Code, 
    SUM(perc) 
FROM 
    example 
GROUP BY Code 
HAVING SUM(perc) > 1 
+0

謝謝大家。你的迴應很有啓發。德姆斯,那根本不是光顧的。我讀了更多關於這個主題並且現在理解它。謝謝 – 2012-03-23 01:22:35

相關問題