Десятичное умножение T-SQL - PullRequest
9 голосов
/ 08 июля 2011

MSDN говорит о точности и шкала десятичного умножения результата :

  • Точность и масштаб результата имеют абсолютный максимум 38. Когда точность результата большечем 38, соответствующая шкала уменьшается, чтобы предотвратить усечение неотъемлемой части результата.

Итак, когда мы выполним это:

DECLARE @a DECIMAL(18,9)
DECLARE @b DECIMAL(19,9)

set @a = 1.123456789
set @b = 1

SELECT @a * @b

, результат будет 1.12345689000000000 (9 нулей), и мы увидим, что он не усекается, потому что 18 + 19 + 1 =38 (верхний предел).

Когда мы повышаем точность @a до 27, мы теряем все нули, и в результате получаем только 1.123456789.Далее мы продолжаем усечение и получаем округление результата.Например, повышение точности от @a до 28 приводит к 1.12345679 (8 цифр).

Интересно то, что в какой-то момент с точностью, равной 30, у нас будет 1.123457, и этот результат не изменится.дальше (перестает быть усеченным).

31, 32 и до 38 результатов одинаковы.Как это можно объяснить?

1 Ответ

4 голосов
/ 12 июля 2011

Десятичные и числовые результаты операций имеют минимальный масштаб 6 - это указано в таблице документации msdn для деления, но то же самое относится и к умножению в случае усечения масштаба, как в вашем примере.

Это поведение более подробно описано в блоге sqlprogrammability .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...