2017-09-09 113 views
1

在我的數據庫中,我有一個表格,字段爲Profit和Month,Profit爲DOUBLE類型。SQL GROUP BY和DOUBLE VALUE屬性

我執行以下查詢:

SELECT SUM(profit) AS profit , Month 
        FROM general_Table 
        Where ID = '101' AND Year = '2017' 
        GROUP BY Month 

我相信,我的數據庫只包含兩個小數點,如9.02或3.79雙打,但結果我得到的是

Profit    Month 
904953.49   1 
834431.1699999999 2 
925363.4200000018 3 

我希望我不應該得到兩個以上的小數點,因爲只有輸入有兩個小數點的值。有人可以解釋我的查詢是否錯誤?

+2

您可能想要閱讀https://dev.mysql.com/doc/refman/5.7/en/problems-with-float.html和**停止使用FLOAT或DOUBLE存儲精確比例的數字,如貨幣值。 ** –

+1

另請參閱[我的2013鳴叫](https://twitter.com/billkarwin/status/347561901460447232):「如果我每次看到有人使用FLOAT存儲貨幣時都有一毛錢,我會有$ 999.997634。#ieee754jokes「 –

回答

0

我的數據庫只包含兩個小數點雙打

Flo ating點數是實數的近似值。大多數實數不能完全使用浮點格式表示。

即使使用基數10中的常用數字表示,大多數數字也不能完全表示。例如,1/3通常表示爲0.330.3330.333333333333,但不管我們在小數點後放置了多少個3,該值不是1/31/3也不能完全表示爲浮點。

並非所有可完全表示爲基數10的數字都可以完全表示爲浮點; 0.2就是這樣一個數字。

「兩位小數位」對於浮點格式並不意味着什麼。它代表使用二進制表示的值,而不是十進制。


回到你的問題,最常見的(也可能只有一個)原因,有人關心了一些的小數位數的當數代表錢。

大多數RDBMS-es提供了一種旨在存儲金額的數據類型。它們是使用定點數字來實現的,而且是精確的。

在MySQL上,使用DECIMAL類型。你能做的最好的事情是列類型更改爲DECIMAL

ALTER TABLE general_Table 
MODIFY COLUMN profit DECIMAL(9,2) 

聲明DECIMAL(M,N)門店數量上M數字包括N十進制數字和整數部分(M-N位)。

當它用於存儲貨幣時,N通常是2。調整M的值以符合您的需求。 DECIMAL(9,2)準確地表示從-9,999,999.99+9.999.999,99的任何金額。

1

如果你只想要兩個小數點,然後轉換爲十進制:

SELECT CAST(SUM(profit) as DECIMAL(9, 2)) AS profit , Month 
FROM general_Table 
WHERE ID = 101 AND Year = 2017 
GROUP BY Month; 

如果要存儲的使用浮點表示值,則該值不準確的 - 如您對結果注意。建議使用定點表示法存儲貨幣值(decimal/numeric)。數據庫支持兩種不同的存儲十進制值的方法,這是有原因的 - 有些應用程序需要精確的精度,有些需要能夠表示寬範圍的值。

出於輸出目的,您可以轉換爲固定點轉發。

+0

我們得到的結果是否相同?我的意思是我認爲求和運算符正在做錯算,因爲結果有更多的小數點比初始值在這一點上,只是鑄造最終值wouldnt幫助.... –

+1

@ilkerKaya。 。 。如果你擔心這一點,你可以在總和之前進行演員表演。但是你應該改變數據的表示來使用'decimal'。不要修復查詢,修復數據。 –

0

可以使用TRUNCATE功能沒有四捨五入的結果和ROUND功能四捨五入的結果:

TRUNCATE(SUM(profit), 2) 

或者:

ROUND(SUM(profit), 2)