2010-02-22 10 views
14

Non è stato possibile trovare nulla che respinga o confermi se il tipo di dati "MONEY" di SQL Server è un punto mobile decimale o un punto mobile binario.Il tipo di dati "MONEY" di SQL Server è un virgola mobile decimale o un punto mobile binario?

Nella descrizione si dice che l'intervallo di tipo MONEY è compreso tra -2^63 e 2^63 - 1, quindi questo tipo implica che dovrebbe essere un binario in virgola mobile.

Ma su this page elenca DENARO come numerico "esatto". Quale tipo di DENARO potrebbe essere un virgola mobile decimale (altrimenti come è esatto? O qual è la definizione di esatto?)

Quindi se MONEY è un decimale virgola mobile, allora qual è la differenza tra DENARO e DECIMALE (19,4)?

risposta

24

Né. Se fosse un'implementazione in virgola mobile, sarebbe soggetta alle stesse imprecisioni dei tipi FLOAT e REAL. Vedi Floating Point su wikipedia.

MONEY è un tipo fixed point.

È un byte più piccolo di un DECIMAL (19,4), perché ha un intervallo inferiore (922,337,203,685,477,5808 a 922,337,203,685,477,5807) rispetto a (-10^15 + 1 a 10^15-1).

+0

Sei sicuro che DECIMAL necessita di un byte in più per memorizzare la scala? Non è memorizzato come parte del tipo di colonna? –

+0

@Mark: Hmm, vedo il tuo punto, ma deve essere usato per memorizzare qualcosa giusto? È la precisione o la scala. – hobodave

+0

@ Mark: lo sai? – hobodave

3

Penso che la differenza principale sarà lo spazio di archiviazione richiesto.

DECIMAL(19,4) richiederanno 9 stoccaggio byte

MONEY richiede 8 byte di archiviazione

10

per vedere le differenze possiamo guardare la documentazione:

Documentazione per 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 

Il denaro e tipi di dati smallmoney sono accurate a un decimillesimo di unità monetarie che rappresentano .

confronta con gli decimal:

Quando si usa la massima precisione, i valori validi sono da -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 

quindi non sono esattamente equivalenti, solo simile. Un DECIMAL (19,4) ha un intervallo leggermente superiore a MONEY (può memorizzare da -10^15 + 0,0001 a 10^15 - 0,0001), ma richiede anche un byte in più di memoria.

In altre parole, questo funziona:

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

999999999999999.9999 

Ma questo non lo fa:

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. 

C'è anche una differenza semantica. Se si desidera memorizzare i valori monetari, ha senso utilizzare il tipo di moneta.

+0

Hai dirottato la mia risposta e l'hai resa più elaborata. :-P – hobodave

+0

tnx per la scrittura, ma il punto intero è che il DENARO è un punto fisso che lo rende una bestia completamente diversa. – kaptan

+1

@Farzad: No, non è una bestia completamente diversa. Anche DECIMAL è un punto fisso. Il ridimensionamento è fisso in entrambi i tipi, ma con il tipo DECIMAL puoi scegliere a cosa è fissato, ma con MONEY non puoi. –

Problemi correlati