2016-09-15 3 views
3

Когда я запускаю ниже запрос в SQL SERVER 2014, выходной тип данных, как представляется, отличается от типа входных данныхданных в подразделении SQL Server

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 

SELECT (@i/@j) 

Ожидаемый результат: 0,25
Но то, что я м: 0,25000000000000000000

Могу ли я узнать, почему этот DECIMAL (18,2) был изменен?

+0

Стандартное поведение для десятичного деления. – jarlh

+3

Возможно, вы захотите прочитать [точность, масштаб и длину] (https://msdn.microsoft.com/en-GB/library/ms190476.aspx) и, в частности, как они определены для результатов. –

+0

Вы можете '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

ответ

1

Попробуйте выполнить нижеследующий запрос.

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 

SELECT CAST((@i/@j) as decimal(18,2)) 
1

Для SQL-сервера 2012+ можно использовать FORMAT():

SELECT FORMAT((@i/@j), 'N2') 

Как сказал @Damien_the_Unbeliever, следует отметить, что это будет возвращать результат в виде строки ..

Для более низких версий попробовать это:

SELECT cast((@i/@j) as decimal(18,2)) 
+0

Даже на SQL Server 2012 и выше вы обычно предпочитают придерживаться соответствующих типов данных, а не конвертировать в строку, если это специально не предназначено для целей презентации. –

+0

@Damien_The_Unbeliever Я добавил комментарий :) – sagi

1

Вы можете попробовать это

SELECT convert(decimal(18,2),(@i/@j)) 
0

Просто попробуйте это:

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 
SELECT (@i/CAST(@j AS FLOAT)) 

ИЛИ

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8 
SELECT CAST((@i/@j) AS FLOAT) 
0

Пожалуйста, обратитесь 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)) 
Смежные вопросы