Вчера наткнулся на неожиданное для меня поведение MS SQL 2005. Задача была простая: из суммы выделить размер НДС. И хотя я знаю, что чисто математически эта задача неразрешима, но что поделаешь сказали надо. Пишу запрос:
- SELECT 24000 * (1 - 1 / 1.18) as NDS
И получаю значение 3661,032, которое немного (на несколько копеек) не сходится со значением, посчитанным на калькуляторе – 3661,016949. После некоторых экспериментов выяснилось, что MS SQL округляет значение коэффициента 1 / 1.18 до 6 знаков после запятой, и похоже что с бухгалтерским округлением. То есть получается 0,847457 вместо 0,84745762711, что при больших суммах даёт приличную погрешность.
Решить удалось чётким указанием типа, так:
- SELECT 24000 * (1 - CAST(1 as NUMERIC(15,8))/CAST(1.18 as NUMERIC(15,8))) as NDS
Или:
- SELECT 24000 * (1 - 1/CAST(1.18 as NUMERIC(15,8))) as NDS
Или так:
- DECLARE @i NUMERIC (15, 8), @n NUMERIC (15, 8)
- SELECT @i = 1, @n = 1.18
- SELECT 24000 * (@i - @i / @n) as NDS
Комментарии
SELECT @s=24000
SELECT (@s - @s / 1.18)
Здесь нет умножения на приближённое число