将SQL FLOAT转换为SQL INT,丢失数据

时间:2010-12-09 13:29:45

标签: sql casting floating-point integer

我在将存储在FLOAT数据类型中的某些数据转换为存储在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.

有谁知道为什么会这样?我猜它是某种漂浮的细微差别。但我从未想过会出现类似上述问题。有任何想法吗?在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:16)

这是典型的(int)((0.1+0.7)*10)问题。因为浮点数具有任意精度,所以即使对于非常简单的情况,也可以在转换为int时丢失一些数据。

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

答案 1 :(得分:0)

由于浮动计算机的特殊性,这是浮点数据类型的常见行为。 使用小数点后固定位的十进制(数字)数据类型。例如,十进制(10,6)。