DECIMAL (Precision, Scale) для получения максимальной точности в расчетах - PullRequest
0 голосов
/ 30 ноября 2010

Я разделил 500/15, а затем умножил результат обратно на 15, но я получил разные результаты для разных Точности и Шкалы.

Пожалуйста, запустите следующий скрипт.

DECLARE @cost DECIMAL(36,4) 
SET @cost = 500
SELECT @cost/15, (@cost/15) * 15
-- Scale is 4 so on multlyping, after dividing, result is not 500
-- Result = 33.333333, 499.999995

DECLARE @cost2 DECIMAL(36,5)
SET @cost2 = 500
SELECT @cost2/15, (@cost2/15) * 15
-- Scale is 5 so on multlyping, after dividing, result is 500
-- Result = 33.3333333, 500.000000

DECLARE @cost3 DECIMAL(32,5)
SET @cost3 = 500
SELECT @cost3/15, (@cost3/15) * 15
-- Precision decrease to 32 from 36 result is again not 500
-- Result = 33.33333333, 499.99999995

Iнужно хранить этот расчет в дБ и мне нужна максимальная точность.Это не какое-то научное приложение, но клиент должен иметь это.

Что я хочу знать, мне нужна точность, которая дает мне десятичное число (36, 5).Должен ли я использовать это, потому что ему нужно 17 байтов?Какой должен быть лучший подход для получения точности, которую я объяснил в примерах?

1 Ответ

1 голос
/ 12 января 2011

Проблема с преобразованием заключается в том, что DECIMAL (36, 4) технически недостаточно для хранения промежуточного результата деления 500 на 15. SQL Server правильно оценивает его как FLOAT.

Правильный способ сделать это - сначала умножить, а затем разделить.

DECLARE @cost DECIMAL(36,4) 
SET @cost = 500
SELECT @cost/15, @cost*15/15
-- Scale is 4 so on multlyping, after dividing, result is not 500
-- Result = 33.333333, 500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...