Cóż, lubię MONEY! Jest to bajt tańszy niż DECIMAL, a obliczenia wykonują się szybciej, ponieważ (pod przykryciem) operacje dodawania i odejmowania są zasadniczo liczbami całkowitymi. @ Przykład SQLMenace - który jest doskonałym ostrzeżeniem dla nieświadomych - może być również zastosowany do INTeger, gdzie wynik byłby zerowy. Ale to nie jest powód, aby nie używać liczb całkowitych - w stosownych przypadkach .
Jest więc całkowicie „bezpieczny” i odpowiedni do użycia, MONEYgdy masz do czynienia z tym, z czym masz do czynienia MONEYi stosuj go zgodnie z matematycznymi zasadami, które on przestrzega (tak samo jak np INT.
Czy byłoby lepiej, gdyby SQL Server promował dzielenie i mnożenie MONEYna DECIMALs (lub FLOATs?) - być może, ale nie zdecydowali się tego zrobić; nie zdecydowali się też promować INTegerów FLOATpodczas dzielenia ich.
MONEYnie ma problemu z precyzją; to, że DECIMALpodczas obliczeń może zostać użyty większy typ pośredni, jest po prostu „cechą” używania tego typu (i nie jestem pewien, jak daleko sięga ta „cecha”).
Aby odpowiedzieć na konkretne pytanie, „ważny powód”? Cóż, jeśli chcesz bezwzględną wydajność maksymalnie w SUM(x)którym xmogłyby być DECIMALlub MONEY, wtedy MONEYbędzie miał przewagę.
Nie zapomnij też, że jest mniejszym kuzynem SMALLMONEY- tylko 4 bajty, ale osiąga maksimum przy 214,748.3647- co jest dość małe jak na pieniądze - i dlatego często nie jest dobrze dopasowane.
Aby dowieść sensu przy użyciu większych typów pośrednich, jeśli przypisujesz pośrednio jawnie do zmiennej, DECIMALwystępuje ten sam 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
Daje 2950.0000(okej, więc przynajmniej DECIMALzaokrąglaj, a nie MONEYobcinaj - tak samo jak liczba całkowita).
DECIMAL(19, 4)jest popularnym wyborem sprawdź to również sprawdź tutaj Formaty walut światowych, aby zdecydować, ile miejsc po przecinku użyć, w czym nadzieja pomaga.