Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Округление decimal / 18 сообщений из 18, страница 1 из 1
26.12.2018, 15:19
    #39753459
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Коллеги, есть код

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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-ти знаков после запятой)?
...
Рейтинг: 0 / 0
26.12.2018, 15:24
    #39753461
-=DiM@n=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Вот хорошая статья
https://habr.com/post/205938/
...
Рейтинг: 0 / 0
26.12.2018, 15:32
    #39753468
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
-=DiM@n=-,

Код: sql
1.
SELECT 1.00000000000000001 * 1.0000000000000001 / 0.777777777777777777777



дает

1.28571428571428
...
Рейтинг: 0 / 0
26.12.2018, 15:33
    #39753470
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
wsnet,

Код: sql
1.
SELECT 2.00000000000000001 * 8.0000000000000001 / 8760.0000000000000001


0.0018264840182648402
...
Рейтинг: 0 / 0
26.12.2018, 15:33
    #39753471
-=DiM@n=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Объявите их в виде переменных и посмотрите, что будет
...
Рейтинг: 0 / 0
26.12.2018, 15:33
    #39753472
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
-=DiM@n=-, почитал, но немного не понял, как в моем случаи быть?
...
Рейтинг: 0 / 0
26.12.2018, 15:38
    #39753475
-=DiM@n=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
В конце статьи отличный совет:
Придется с этим смириться и всегда (абсолютно всегда!) очень деликатно выставлять точность

Просто выполните
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
26.12.2018, 15:39
    #39753477
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
wsnet-=DiM@n=-, почитал, но немного не понял, как в моем случаи быть?

Вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
26.12.2018, 15:47
    #39753487
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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



Вроде бы помогло
...
Рейтинг: 0 / 0
26.12.2018, 15:48
    #39753489
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
a_voronin, не так не могу сделать
...
Рейтинг: 0 / 0
26.12.2018, 15:48
    #39753490
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
wsnet
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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



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

Вы как следует это протестируйте на самых разных цифрах.
...
Рейтинг: 0 / 0
26.12.2018, 15:50
    #39753491
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
a_voronin, елки палки я думал в mssql с этим все четко, ок - буду тестить!
...
Рейтинг: 0 / 0
26.12.2018, 16:02
    #39753498
demind10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Используйте вариант a_voronin.
Только вот в таком виде он будет мне кажется немного проще для понимания
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
...
Рейтинг: 0 / 0
26.12.2018, 16:31
    #39753516
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Читаем до просветления: https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017
Код: sql
1.
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 перед делением.
...
Рейтинг: 0 / 0
26.12.2018, 16:58
    #39753532
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
iapЧитаем до просветления: https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-2017
Код: sql
1.
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. Результат приводится к желаемой разрядности.
...
Рейтинг: 0 / 0
26.12.2018, 19:15
    #39753614
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
wsnet,

на самом деле ответ должен быть 0.001826484018265.
...
Рейтинг: 0 / 0
26.12.2018, 19:36
    #39753627
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
Владислав Колосовwsnet,

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 / 0
26.12.2018, 19:56
    #39753634
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление decimal
a_voroninКто-нибудь может внятно объяснить, почему умножение на 1E10 числителя и знаменателя повысило точность конечного результата.
Код: sql
1.
2.
3.
4.
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');
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Округление decimal / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]