Ну, мені подобається MONEY! Це байт дешевше DECIMAL, а обчислення виконуються швидше, оскільки (під кришками) операції додавання та віднімання по суті є цілими операціями. Приклад @ SQLMenace - який є чудовим попередженням для невідомих - може однаково застосовуватися і до INTegers, де результат буде нульовим. Але це не є причиною не використовувати цілі числа - де це доречно .
Таким чином, це абсолютно "безпечно" і доцільно використовувати, MONEYколи ви маєте справу з цим, MONEYі використовувати його відповідно до математичних правил, які вони дотримуються (так само, як і INTeger).
Було б краще, якби SQL Server сприяв поділу та множенню MONEYs на DECIMALs (або FLOATs?) - можливо, але вони не вирішили цього робити; і вони не вирішили просувати INTегер під FLOATчас їх поділу.
MONEYне має жодних питань щодо точності; щоб DECIMALотримати більший проміжний тип, який використовується під час обчислень, це лише "особливість" використання цього типу (і я не впевнений, наскільки ця "особливість" поширюється).
Щоб відповісти на конкретне запитання, "переконлива причина"? Ну, якщо ви хочете абсолютну продуктивність максимуму в SUM(x)якому xможе бути DECIMALабо MONEY, то MONEYбуде мати перевагу.
Крім того, не забувайте, що це менший двоюрідний брат - SMALLMONEYпросто 4 байти, але він максимум на 214,748.3647- що є досить маленьким для грошей - і так часто не підходить.
Для підтвердження суті використання великих проміжних типів, якщо проміжний явно призначати змінну, DECIMALвиникає та сама проблема:
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
Виробляє 2950.0000(добре, так що принаймні DECIMALокруглене, а не MONEYусічене - те саме, що і ціле число).
DECIMAL(19, 4)це популярний вибір, перевірте це, також перевірте тут Формати світової валюти, щоб визначити, скільки десяткових знаків використовувати, надію, допоможе.