Ну, мне нравится MONEY
! Это на байт дешевле, чем DECIMAL
, и вычисления выполняются быстрее, потому что (под прикрытием) операции сложения и вычитания по сути являются целочисленными операциями. Пример @ SQLMenace & mdash; который является отличным предупреждением для незнающих & ndash; также может быть применен к INT
egers, где результат будет нулевым. Но это не причина, чтобы не использовать целые числа & mdash; , где это уместно .
Таким образом, совершенно «безопасно» и целесообразно использовать MONEY
, когда вы имеете дело с MONEY
и использовать его в соответствии с математическими правилами, которые следует (то же, что INT
eger).
Было бы лучше, если бы SQL Server способствовал делению и умножению MONEY
на DECIMAL
s (или FLOAT
s?) - возможно, но они не решили этого делать; и при этом они не решили повысить INT
эгеров до FLOAT
s при их разделении.
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
усечено - тоже самое, что и целое число.)