2010-02-22 5 views
14

Je n'ai trouvé aucun élément qui rejette ou confirme si le type de données 'MONEY' de SQL Server est un nombre à virgule flottante décimal ou un nombre à virgule flottante binaire.Le type de données 'MONEY' de SQL Server est-il un virgule flottante décimale ou un virgule flottante binaire?

Dans la description, il est dit que la gamme de type MONEY est de -2^63 à 2^63 - 1, ce qui implique que ce soit un point flottant binaire.

Mais sur this page il indique MONEY comme "exact" numérique. Quel type suggère que MONEY peut être un virgule flottante décimale (sinon comment est-ce exact?)

Ensuite, si MONEY est un nombre à virgule décimale, quelle est la différence entre MONEY et DECIMAL? (19,4)?

Répondre

24

Ni. S'il s'agissait d'une implémentation de virgule flottante, elle serait sujette aux mêmes inexactitudes que les types FLOAT et REAL. Voir Floating Point sur wikipedia.

MONEY est un type fixed point.

Il est un octet plus petit qu'un DECIMAL (19,4), parce qu'il a une plus petite gamme (922,337,203,685,477.5808 à 922,337,203,685,477.5807) par opposition à (-10^15 + 1 à 10^15-1).

+0

Etes-vous sûr que DECIMAL a besoin d'un octet supplémentaire pour stocker la balance? N'est-il pas stocké dans le type de colonne? –

+0

@Mark: Hmm, je vois ce que vous voulez dire, mais ça doit être utilisé pour stocker quelque chose? C'est soit la précision, soit l'échelle. – hobodave

+0

@Mark: Le savez-vous? – hobodave

3

Je pense que la principale différence sera l'espace de stockage requis.

DECIMAL(19,4) nécessitera 9 octets de stockage

MONEY nécessite 8 octets de stockage

10

Pour voir les différences que nous pouvons regarder la documentation:

Documentation pour 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 

L'argent et les types de données smallmoney sont exacts à un dix millième des unités monétaires qu'ils représentent .

Comparer à l'decimal:

Lorsque la précision maximale est utilisée, les valeurs valides sont de -10^38 + 1 à 10^38 - 1.

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

Donc, ils ne sont pas exactement équivalent, juste similaire. Un DECIMAL (19,4) a une portée légèrement supérieure à MONEY (il peut stocker de -10^15 + 0,0001 à 10^15 - 0,0001), mais nécessite également un octet de stockage supplémentaire.

En d'autres termes, cela fonctionne:

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

999999999999999.9999 

Mais cela ne:

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. 

Il y a aussi une différence sémantique. Si vous voulez stocker des valeurs monétaires, il est logique d'utiliser l'argent de type.

+0

Vous avez détourné ma réponse et l'avez rendue plus fantaisiste. :-P – hobodave

+0

tnx pour l'écriture mais tout le point est que MONEY est un point fixe qui en fait une bête complètement différente. – kaptan

+1

@Farzad: Non, ce n'est pas une bête complètement différente. DECIMAL est un point fixe aussi. La mise à l'échelle est fixe dans les deux types, mais avec le type DECIMAL vous pouvez choisir ce à quoi elle est fixée, mais avec ARGENT vous ne pouvez pas. –

Questions connexes