2010-12-09 70 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)。