Пожалуйста, обратитесь https://msdn.microsoft.com/en-IN/library/ms190476.aspx
Относительно масштаб и точность нормальной работы Отдела заключается в следующем
Операция: e1/e2
Результат точности (Pr): p1 - s1 + s2 + max(6, s1 + p2 + 1)
Результат масштабирования (Sr): max(6, s1 + p2 + 1)
Где
p1 является точность e1
s1 является масштаб e1
p2 является точность e1
s2 является масштаб e1
В вашем случае p1 = p2 = 18 и s1 = s2 = 2
в соответствии с приведенной выше расчета
точность вывода (Pr) и шкала outpur (Sr) будет выглядеть следующим образом
Pr = p1 - s1 + s2 + max(6, s1 + p2 + 1)
Pr = 18 - 2 + 2 + max(6, 2 + 18 + 1)
Pr = 18 - 2 + 2 + 21
Pr = 39
Следовательно, должно быть максимум 39 цифр в результате. Но
- В результате точность и масштаб имеет абсолютный максимум 38. Когда результат точности больше, чем 38, соответствующий масштаб уменьшается, чтобы предотвратить неотъемлемую часть результата от усекается.
отсюда будет 38 цифр.
В результате деления в десятичное значение меньше единицы, но больше, чем 0, это даст только один 0 до того запятой
Пусть теперь рассчитать Scale (Sr)
Sr = max(6, s1 + p2 + 1)
Sr = max(6, 2 + 18 + 1)
Sr = 21
После десятичной точки должно быть 21 цифра. однако максимальная точность. Последняя цифра в масштабе будет усечена. поэтому в результате вы получаете только 20 цифр после десятичной точки.
Поэтому результат 0,25000000000000000000
Если вы хотите, чтобы получить 0,25 раунд деление с использованием CAST или Преобразовать следующим
DECLARE @i DECIMAL(18,3) = 2 ,@j DECIMAL(18,3) = 8
SELECT CAST((@i/@j) AS Decimal(18,2))
Стандартное поведение для десятичного деления. – jarlh
Возможно, вы захотите прочитать [точность, масштаб и длину] (https://msdn.microsoft.com/en-GB/library/ms190476.aspx) и, в частности, как они определены для результатов. –
Вы можете 'CAST',' CONVERT' или создать переменную с 'DECIMAL (18,2)' для сохранения этой операции. как 'DECLARE @i DECIMAL (18,2) = 2, @ j DECIMAL (18,2) = 8, @k DECIMAL (18,2); SELECT @k = (@ i/@ j); SELECT @k; ' – Arulkumar