2010-12-09 68 views
8

我在將存儲在FLOAT數據類型中的一些數據轉換爲存儲在INT數據類型中的數據時遇到了一些問題。下面的例子說明了我的問題:將SQL FLOAT轉換爲SQL INT,丟失數據

DECLARE @data TABLE 
(
id INT, 
weight FLOAT 
) 
INSERT INTO @data VALUES(1,0.015662) 

SELECT CAST(weight * 1000000 AS INT) FROM @data 
SELECT 0.015662 * 1000000 
SELECT CAST(0.015662 * 1000000 AS INT) 

期望的結果將是:ID = 1 VALUE = 15662 但是從@data表來臨的時候,我似乎並沒有得到這一點。我反而得到ID = 1 VALUE = 15661.

有沒有人有任何想法,爲什麼這是?我猜這是某種浮動的細微差別。但我從來沒有想過它會有類似上述的問題。有任何想法嗎?在此先感謝您的幫助。

回答

16

這是經典(int)((0.1+0.7)*10)的問題。由於浮點數具有任意的精度,因此即使對於非常簡單的情況,也可以將某些數據丟失轉換爲int。

改爲使用ROUND(weight * 1000000.0, 0)

+0

ROUND(weight * 1000000.0,0)會更好,因爲我們不知道哪個系統作者使用。 – Lex 2010-12-09 13:43:20

0

這是浮點數據類型的常見行爲,因爲計算機上float的特殊性。 在小數點後使用固定數字的十進制(數字)數據類型。例如,十進制(10,6)。