SQL Real vs Flotante

Digamos que tengo las siguientes 2 consultas:

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

La primera consulta devuelve: 799.8
La segunda consulta devuelve: 799.800031781197

¿Por qué la segunda consulta no devuelve lo mismo que la primera?

preguntado el 22 de mayo de 12 a las 19:05

Respuesta corta: real está limitado a 4 bytes, mientras que float no es. Como resultado, float tiene más precisión, por lo tanto, más lugares decimales. En cuanto a necesitar toda esa precisión para su muestra, 0.3 es un decimal terminador, pero no termina en binario. -

1 Respuestas

Los tipos binarios de punto flotante (como real y float) no pueden representar exactamente números decimales. En particular, no es posible almacenar exactamente 0.3 como un número de punto flotante binario. En su lugar, 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 o numérico. Pero tenga en cuenta que a pesar de que estos tipos pueden almacenar con precisión valores decimales hasta un cierto número de dígitos, los cálculos aún pueden producir números que no se pueden representar con exactitud. Por ejemplo el resultado de 0.1 / 0.3 no se puede almacenar exactamente en un decimal aunque ambos 0.1 y 0.3 puede. En este caso, el resultado se redondeará al valor más cercano que se pueda almacenar en el tipo (p. ej. 0.333333333 dependiendo de la precisión).

contestado el 22 de mayo de 12 a las 19:05

Sí, así como 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 decimal, como 0.1, son recurrentes en binario. Por ejemplo, 0.1dec = 0.0001100110011... para siempre en binario y, por lo tanto, no se puede representar exactamente. - Ingeniero invertido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.