2012-05-22 15 views
7

Digamos que tengo los siguientes 2 preguntas:SQL real vs flotador

select sum(cast(2666 as float)) * cast(.3 as float) 
select sum(cast(2666 as real)) * cast(.3 as real) 

El 1er consulta devuelve: 799.8
La 2ª consulta devuelve: 799.800031781197

¿Por qué la consulta segundo no devuelven los mismos cosa como la 1ra?

Respuesta

18

Los tipos binarios de coma flotante (como real y flotante) no pueden representar números decimales exactamente. En particular, no es posible almacenar exactamente 0.3 como un número de punto flotante binario. En cambio, se almacena un número muy cercano a 0.3. Esto se llama un error de representación.

El tamaño del error es diferente para real y flotante porque tienen una precisión diferente.

Si desea almacenar números decimales con mayor precisión, considere usar decimal or numeric. Pero tenga en cuenta que, aunque estos tipos pueden almacenar con precisión valores decimales hasta un cierto número de dígitos, los cálculos pueden producir números que no se pueden representar exactamente. Por ejemplo, el resultado de 0.1/0.3 no se puede almacenar exactamente en un decimal aunque ambos 0.1 y 0.3 pueden. En este caso, el resultado se redondeará al valor más cercano que pueda almacenarse en el tipo (por ejemplo, 0.333333333 dependiendo de la precisión).

+2

Sí, al igual que 1/3 es un número recurrente en decimal (0.333333 .. para siempre), también es recurrente en binario: 0.01010101010101 --- para siempre. Sin embargo, algunos números no recurrentes en decimales, como 0.1, son recurrentes en binario. P.ej. 0.1dec = 0.0001100110011 ... para siempre en binario, y por lo tanto no se puede representar exactamente. – DaveBoltman