2010-12-09 20 views
8

Tengo algunos problemas para convertir algunos datos almacenados en un tipo de datos FLOAT en datos almacenados en un tipo de datos INT. El siguiente ejemplo ilustra mi problema:Conversión de SQL FLOAT a SQL INT, pérdida de datos

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) 

Los resultados deseados serían: ID = 1 VALUE = 15662 Sin embargo, cuando viene de la tabla @data, que no parecen conseguir esto. En su lugar, obtengo ID = 1 VALUE = 15661.

¿Alguien tiene alguna idea de por qué es esto? Supongo que es una especie de matiz flotante. Pero nunca pensé que tendría un problema con algo como lo de arriba. ¿Algunas ideas? Gracias de antemano por tu ayuda.

Respuesta

16

Este es el problema clásico (int)((0.1+0.7)*10). Debido a que los flotantes tienen una precisión arbitraria, es posible que se pierdan algunos datos al realizar conversiones en int, incluso en casos muy simples.

Use ROUND(weight * 1000000.0, 0) en su lugar.

+0

ROUND (peso * 1000000.0, 0) sería mejor porque no sabemos qué sistema utiliza el autor. – Lex

0

Esto es un comportamiento común para el tipo de datos float debido a la especificidad de float en las computadoras. Use el tipo de datos decimal (número) con dígitos fijos después del punto decimal. Por ejemplo, decimal (10, 6).

Cuestiones relacionadas