Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Округления  [new]
mezzanine
Member

Откуда:
Сообщений: 157
День добрый. Тестовый код:
DECLARE @f FLOAT = 49.885,
        @n NUMERIC(15, 4) = 49.885;

SELECT ROUND(@f, 2) AS f,
       ROUND(@n, 2) AS n;


1. Почему "f" = 49.88 а не 49.85 как при 2.
2. Почему "n" = 49.8900 а не 49.89

В запросе вычисляю значение, нужно множить несколько значений, чтоб сохранить точность все числа кастуе на FLOAT. Результат должен быть с 2 знаками по запятой и округление од 5 вверх.
25 окт 17, 15:41    [20899531]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
o-o
Guest
автор
Почему "n" = 49.8900 а не 49.89

NUMERIC(15, 4) -- сколько знако-мест заказал, столько и получил


автор
Почему "f" = 49.88 а не 49.85 как при 2

@f FLOAT = 49.885 -- с флоатом связался, точность потерял


автор
49.88 а не 49.85

а 5 вообще каким местом?
25 окт 17, 15:48    [20899551]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
mezzanine
Member

Откуда:
Сообщений: 157
o-o,

Получается что с NUMERIC(15, 4) не получиться ROUND(x, 2) получить число с 2 знаками по запятой?
Ошибка, не 49.85 а 49.89.

Как раз без FLOAT при умножении получаются страшные потери. Умножения хорошо на нем работают, не могу округлить по человечески 49.885 а 49.89. Конечно можно это завернуть в кучу кастов, но может есть решение более простое.
25 окт 17, 15:57    [20899597]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
mezzanine,

откуда бы взяться потерям при использовании точных форматов вроде Numeric?
25 окт 17, 16:16    [20899653]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
_human
Member

Откуда:
Сообщений: 556
mezzanine,

По причине использовагия FLOAT рушились мосты и судьбы.
Если нет существенной причины, то его лучше не использовать
25 окт 17, 16:25    [20899678]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
mezzanine
Member

Откуда:
Сообщений: 157
_human,

Например:
WITH cte
AS
(SELECT CAST(1.00000000 AS NUMERIC(19, 8)) AS v1,
        CAST(0.00010000 AS NUMERIC(19, 8)) AS v2,
        CAST(714.81428570 AS NUMERIC(19, 8)) AS v3)
SELECT v1,
       v2,
       v3,
       (v2 / v3) AS v4,
       v1 * (v2 / v3) AS v5
  FROM cte


И имеем V5 = 0,0000001 а должно быть 0,00000013. Если использовать FLOAT то все как нужно.
25 окт 17, 16:32    [20899699]     Ответить | Цитировать Сообщить модератору
 Re: Округления  [new]
_human
Member

Откуда:
Сообщений: 556
mezzanine,

Я так понимаю, что результат вычисления нужно брать под контроль.

WITH cte
AS
(
	SELECT 
		CAST(1.00000000 AS NUMERIC(19, 8)) AS v1,
		CAST(0.00010000 AS NUMERIC(19, 8)) AS v2,
		CAST(714.81428570 AS NUMERIC(19, 8)) AS v3
)
SELECT v1,
       v2,
       v3,
       (v2 / v3) AS v4,
       v1 * (CONVERT(NUMERIC(19, 18), v2 / v3)) AS v5
FROM cte
25 окт 17, 16:44    [20899750]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить