2010-02-22 16 views
14

No pude encontrar nada que rechace o confirme si el tipo de datos 'MONEY' de SQL Server es un punto flotante decimal o punto flotante binario.¿El tipo de datos "MONEY" de SQL Server es un punto flotante decimal o un punto flotante binario?

En la descripción, dice que el rango del tipo de DINERO es de -2^63 a 2^63 - 1, por lo que este tipo de implica que debe ser un punto flotante binario.

Pero en this page enumera MONEY como "exacto" numérico. ¿Qué tipo de sugiere que el DINERO sea un punto flotante decimal (de lo contrario, ¿cómo es exacto? O ¿cuál es la definición de exacto?)

Entonces, si MONEY es un punto flotante decimal, ¿cuál es la diferencia entre MONEY y DECIMAL? (19,4)?

Respuesta

24

Ni. Si se tratara de una implementación de punto flotante, estaría sujeto a las mismas imprecisiones que los tipos FLOAT y REAL. Ver Floating Point en wikipedia.

MONEY es un tipo fixed point.

Es un byte más pequeño que un DECIMAL (19,4), porque tiene un rango menor (922,337,203,685,477.5808 a 922,337,203,685,477.5807) en comparación con (-10^15 + 1 a 10^15-1).

+0

¿Estás seguro de que DECIMAL necesita un byte extra para almacenar la báscula? ¿No está almacenado como parte del tipo de columna? –

+0

@Mark: Hmm, entiendo tu punto, pero debe ser usado para almacenar algo ¿cierto? Es la precisión o la escala. – hobodave

+0

@Mark: ¿Sabes? – hobodave

3

Creo que la principal diferencia será el espacio de almacenamiento requerido.

DECIMAL(19,4) requerirá 9 bytes de almacenamiento

MONEY requerirá 8 bytes de almacenamiento

10

para ver las diferencias que podemos mirar la documentación:

Documentación para money:

Data type Range             Storage 
money  -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes 
smallmoney -214,748.3648 to 214,748.3647       4 bytes 

El dinero y los tipos de datos smallmoney tienen una precisión de una diezmilésima de las unidades monetarias que representan .

Compare con decimal:

Cuando se utiliza la máxima precisión, los valores válidos son de -10^38 + 1 a 10^38 - 1.

Precision Storage 
1 - 9  5 bytes 
10 - 19  9 bytes 
20 - 28  13 bytes 
29 - 38  17 bytes 

así que no son exactamente equivalentes, solo similar. Un DECIMAL (19,4) tiene un rango ligeramente mayor que MONEY (puede almacenar de -10^15 + 0.0001 a 10^15 - 0.0001), pero también necesita un byte de almacenamiento adicional.

En otras palabras, esto funciona:

CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

999999999999999.9999 

Pero esto no es así:

CREATE TABLE Table1 (test MONEY NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

Arithmetic overflow error converting numeric to data type money. 

También hay una diferencia semántica. Si desea almacenar valores monetarios, tiene sentido usar el tipo dinero.

+0

Usted secuestró mi respuesta y la hizo más elegante. :-P – hobodave

+0

tnx para la escritura, pero el punto es que MONEY es un punto fijo que lo convierte en una bestia completamente diferente. – kaptan

+1

@Farzad: No, no es una bestia completamente diferente. DECIMAL es un punto fijo también. La escala está fijada en ambos tipos, pero con el tipo DECIMAL puede elegir a qué se lo fija, pero con MONEY no puede. –

Cuestiones relacionadas