Nun, ich mag MONEY
! Es ist um ein Haar billiger als DECIMAL
und die Berechnungen werden schneller ausgeführt, weil (unter der Haube) Additions- und Subtraktionsoperationen im Wesentlichen Ganzzahloperationen sind. Das Beispiel von @SQLMenace - das eine großartige Warnung für die Unwissenden ist - könnte auch angewendet werden auf INT
egers, bei denen das Ergebnis gleich Null wäre. Aber das ist kein Grund, keine ganzen Zahlen zu verwenden. wo angemessen .
Es ist also vollkommen "sicher" und angemessen, die MONEY
wenn man es mit folgenden Dingen zu tun hat MONEY
und verwenden es nach mathematischen Regeln, die es befolgt (genauso wie INT
eger).
Wäre es besser gewesen, wenn SQL Server die Division und Multiplikation von MONEY
in DECIMAL
s (oder FLOAT
Möglicherweise, aber sie haben sich nicht dafür entschieden; und sie haben sich auch nicht dafür entschieden, die INT
egers zu FLOAT
s, wenn sie geteilt werden.
MONEY
kein Problem mit der Genauigkeit hat; dass DECIMAL
Die Möglichkeit, einen größeren Zwischentyp bei Berechnungen zu verwenden, ist nur ein "Merkmal" der Verwendung dieses Typs (und ich bin mir nicht sicher, wie weit dieses "Merkmal" reicht).
Um die konkrete Frage zu beantworten: ein "zwingender Grund"? Nun, wenn Sie ein absolutes Maximum an Leistung in einem SUM(x)
donde x
könnte entweder sein DECIMAL
o MONEY
entonces MONEY
einen Vorteil haben wird.
Vergessen Sie auch nicht seinen kleineren Cousin, SMALLMONEY
-nur 4 Bytes, aber der Höchstwert liegt bei 214,748.3647
- die für das Geld ziemlich klein ist und daher oft nicht gut passt.
Um zu beweisen, dass die Verwendung größerer Zwischentypen sinnvoll ist, weisen Sie das Zwischenprodukt explizit einer Variablen zu, DECIMAL
leidet unter demselben Problem:
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
Produziert 2950.0000
(okay, also zumindest DECIMAL
eher abgerundet als MONEY
abgeschnitten - wie bei einer ganzen Zahl).
22 Stimmen
DECIMAL(19, 4)
ist eine beliebte Wahl siehe este Prüfen Sie auch ici Weltwährungsformate, um zu entscheiden, wie viele Dezimalstellen zu verwenden sind, hoffentlich hilft das.0 Stimmen
Ich habe mich gefragt, warum der Gelddatentyp 4 Dezimalstellen hat und nicht 2. z.B. 100 Cent in einem Dollar, so dass nur 2 Dezimalstellen erforderlich sind? Um einen Datensatz mit Geldbeträgen unter 9999,99 $ zu speichern, wollte ich einen Datentyp mit dem Wert decimal(6,2) verwenden. Ich bin nicht besorgt über dividieren oder multiplizieren Berechnungen, nur die Speicherung und Summierung
1 Stimmen
Einige Währungen sind in kleinere Teile als Hunderter unterteilt, z.B. ist der bahrainische Dinar in 1000 Fils unterteilt
2 Stimmen
Es gibt gute Gründe, Geld durch Geld zu teilen. Ich habe diesen Thread gefunden, weil ich eine "Geld/Geld"-Situation hatte und ungenaue Antworten erhalten habe. Die Berechnung bestand darin, das Verhältnis eines Dollarbetrags zu einem anderen zu bestimmen. Es scheint immer auf 4 Dezimalstellen abgeschnitten zu werden, so dass ich 0,0109 erhalte, wo ich nach 0,0110 suche (die richtig gerundete Antwort auf mehr Stellen ist 0,01095125.