powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Округление decimal
18 сообщений из 18, страница 1 из 1
Округление decimal
    #39753459
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, есть код

Код: 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
Округление decimal
    #39753461
-=DiM@n=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот хорошая статья
https://habr.com/post/205938/
...
Рейтинг: 0 / 0
Округление decimal
    #39753468
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=DiM@n=-,

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



дает

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

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


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

Просто выполните
Код: 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
Округление decimal
    #39753477
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Округление decimal
    #39753487
Фотография 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
Округление decimal
    #39753489
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin, не так не могу сделать
...
Рейтинг: 0 / 0
Округление decimal
    #39753490
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Округление decimal
    #39753491
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin, елки палки я думал в mssql с этим все четко, ок - буду тестить!
...
Рейтинг: 0 / 0
Округление decimal
    #39753498
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используйте вариант 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
Округление decimal
    #39753516
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 перед делением.
...
Рейтинг: 0 / 0
Округление decimal
    #39753532
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Округление decimal
    #39753614
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

на самом деле ответ должен быть 0.001826484018265.
...
Рейтинг: 0 / 0
Округление decimal
    #39753627
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов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
Округление decimal
    #39753634
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Округление decimal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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