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

Откуда:
Сообщений: 990
Коллеги, есть код

DECLARE @p1 INT
	,@p2 NUMERIC(38, 15)
	,@p3 NUMERIC(38, 15)

SET @p1 = 2
SET @p2 = 8
SET @p3 = (cast(@p1 AS NUMERIC(38, 15)) * @p2) / 8760

SELECT @p3


Вывод @p3 = 0.001826000000000

Как вывести @p3 = 0.001826484018200 (то есть округлить до 15-ти знаков после запятой)?
26 дек 18, 15:19    [21773910]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
Вот хорошая статья
https://habr.com/post/205938/
26 дек 18, 15:24    [21773914]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
-=DiM@n=-,

SELECT 1.00000000000000001 * 1.0000000000000001 / 0.777777777777777777777


дает

1.28571428571428
26 дек 18, 15:32    [21773921]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
wsnet,

SELECT 2.00000000000000001 * 8.0000000000000001 / 8760.0000000000000001

0.0018264840182648402
26 дек 18, 15:33    [21773924]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
Объявите их в виде переменных и посмотрите, что будет
26 дек 18, 15:33    [21773926]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
wsnet
Member

Откуда:
Сообщений: 990
-=DiM@n=-, почитал, но немного не понял, как в моем случаи быть?
26 дек 18, 15:33    [21773927]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
В конце статьи отличный совет:
Придется с этим смириться и всегда (абсолютно всегда!) очень деликатно выставлять точность

Просто выполните
DECLARE @p1 INT
	,@p2 NUMERIC(10, 2)
	,@p3 NUMERIC(38, 15)

SET @p1 = 2
SET @p2 = 8
SET @p3 = (cast(@p1 AS NUMERIC(10, 2)) * @p2) / cast(8760.00 as numeric(10, 2))
SELECT @p3
26 дек 18, 15:38    [21773934]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
wsnet
-=DiM@n=-, почитал, но немного не понял, как в моем случаи быть?


Вот так

DECLARE @p1 INT
	,@p2 NUMERIC(38, 15)
	,@p3 NUMERIC(38, 15)

SET @p1 = 2
SET @p2 = 8.000000000001
SET @p3 = 1E10 * @p1 * @p2 / (1E10 * 8760.0)

SELECT @p3


0.001826484018265
26 дек 18, 15:39    [21773936]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
wsnet
Member

Откуда:
Сообщений: 990
DECLARE @p1 INT
	,@p2 NUMERIC(22, 15)
	,@p3 NUMERIC(22, 15)

SET @p1 = 2
SET @p2 = 8
SET @p3 = (cast(@p1 AS NUMERIC(22, 15)) * @p2) / 8760

SELECT @p3


Вроде бы помогло
26 дек 18, 15:47    [21773950]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
wsnet
Member

Откуда:
Сообщений: 990
a_voronin, не так не могу сделать
26 дек 18, 15:48    [21773952]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
wsnet
DECLARE @p1 INT
	,@p2 NUMERIC(22, 15)
	,@p3 NUMERIC(22, 15)

SET @p1 = 2
SET @p2 = 8
SET @p3 = (cast(@p1 AS NUMERIC(22, 15)) * @p2) / 8760

SELECT @p3


Вроде бы помогло


Вы как следует это протестируйте на самых разных цифрах.
26 дек 18, 15:48    [21773954]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
wsnet
Member

Откуда:
Сообщений: 990
a_voronin, елки палки я думал в mssql с этим все четко, ок - буду тестить!
26 дек 18, 15:50    [21773956]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
demind10
Member

Откуда:
Сообщений: 17
Используйте вариант a_voronin.
Только вот в таком виде он будет мне кажется немного проще для понимания
DECLARE @p1 INT
	,@p2 NUMERIC(38, 15)
	,@p3 NUMERIC(38, 15)

SET @p1 = 2
SET @p2 = 8
SET @p3 = cast(@p1 as float) * @p2 / 8760

SELECT @p3


В кратце: вычисления производим с типом float, а результам преобразуем в нужный Вам decimal.
26 дек 18, 16:02    [21773966]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Читаем до просветления: https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017
SELECT CAST(2 AS NUMERIC(38,15))*CAST(8 AS NUMERIC(38,15))/8760
Это случай 3. в статье по ссылке.
Результирующий тип - NUMERIC(38,6), потому что 38+38-15-15=46>32 и масштаб уменьшается до 6.
К нему же приводится и 8760 перед делением.
26 дек 18, 16:31    [21773999]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
aleks222
Member

Откуда:
Сообщений: 920
iap
Читаем до просветления: https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017
SELECT CAST(2 AS NUMERIC(38,15))*CAST(8 AS NUMERIC(38,15))/8760
Это случай 3. в статье по ссылке.
Результирующий тип - NUMERIC(38,6), потому что 38+38-15-15=46>32 и масштаб уменьшается до 6.
К нему же приводится и 8760 перед делением.


Читать можно до посинения.

Если без лишних заморочек:
1. Вычисления производятся с МАКСИМАЛЬНОЙ доступной разрядностью.
2. Результат приводится к желаемой разрядности.
26 дек 18, 16:58    [21774032]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
Владислав Колосов
Member

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

на самом деле ответ должен быть 0.001826484018265.
26 дек 18, 19:15    [21774190]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4681
Владислав Колосов
wsnet,

на самом деле ответ должен быть 0.001826484018265.


Кто-нибудь может внятно объяснить, почему умножение на 1E10 числителя и знаменателя повысило точность конечного результата.

DECLARE @p1 INT
	,@p2 NUMERIC(38, 15)
	,@p3 NUMERIC(38, 15)

SET @p1 = 2
SET @p2 = 8.000000000001
SET @p3 = 1E10 * @p1 * @p2 / (1E10 * 8760.0)

SELECT @p3
26 дек 18, 19:36    [21774213]     Ответить | Цитировать Сообщить модератору
 Re: Округление decimal  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
a_voronin
Кто-нибудь может внятно объяснить, почему умножение на 1E10 числителя и знаменателя повысило точность конечного результата.
select
 sql_variant_property(1E10 * @p1 * @p2, 'BaseType'), sql_variant_property(1E10 * @p1 * @p2, 'Scale'), sql_variant_property(1E10 * @p1 * @p2, 'Precision');
select
 sql_variant_property(@p1 * @p2, 'BaseType'), sql_variant_property(@p1 * @p2, 'Scale'), sql_variant_property(@p1 * @p2, 'Precision');
26 дек 18, 19:56    [21774224]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить