SQL Десятичное деление на сервере без округления результата - PullRequest
1 голос
/ 27 февраля 2020

Я попробовал приведенное ниже умножение и деление и ожидал того же результата с округлением. Обе операции имеют тип результата как десятичное (38,6). Я хочу знать, почему результат не округляется в случае деления?

результат должен быть округлен для умножения и деления согласно приведенной ниже ссылке введите ссылку описание здесь

select cast(1.225114854 as decimal(38, 9)) * cast(1.000000000 as decimal(28, 9)) as multiply 

Результат: 1.225115

select cast(1.225114854 as decimal(38, 9)) / cast(1.000000000 as decimal(28, 9)) as division

Результат: 1.225114

select 1.225114854 / 1.000000000

Результат: 1.22511485400000000000

1 Ответ

2 голосов
/ 27 февраля 2020

Способ работы SQL сервера в случае умножения и деления десятичных чисел различен, следовательно, разница в количестве цифр:

Предполагается, e1=decimal(p1,s1) and e2=decimal(p2,s2)

Operation   Result precision                        Result scale *
e1 + e2     max(s1, s2) + max(p1-s1, p2-s2) + 1     max(s1, s2)
e1 - e2     max(s1, s2) + max(p1-s1, p2-s2) + 1     max(s1, s2)
e1 * e2     p1 + p2 + 1                             s1 + s2
e1 / e2     p1 - s1 + s2 + max(6, s1 + p2 + 1)      max(6, s1 + p2 + 1)

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

Из-за этого, когда вы умножая 38 десятичных знаков точности, результат становится усеченным. Вы можете использовать следующий расчет, чтобы получить лучшие результаты:

select cast(1.225114854 as decimal(15,9))*cast(1.000000000  as decimal(15,9)) as multiply
select cast(1.225114854 as decimal(15,9))/cast(1.000000000  as decimal(15,9)) as division

Следующая ссылка должна прояснить большинство ваших сомнений:

https://www.codeproject.com/Articles/769823/Losing-Precision-After-Multiplication-in-SQL-Serve

...