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

Откуда:
Сообщений: 40
Доброе время суток!
Тема стара как мир, но все же..
IF NOT (SELECT OBJECT_ID('TEMPDB..#TableTmp')) IS NULL
DROP TABLE #TableTmp

create table #TableTmp ( [t] NUMERIC(16,4) )
insert into #TableTmp
values(314.6346)
select round(t,2) from #TableTmp

Почему не 314.64?
17 ноя 14, 10:35    [16856837]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Glory
Member

Откуда:
Сообщений: 104751
last_man
Почему не 314.64?

Потому, что на округление до 2го знака влияет 3ий знак, а не 4ый
17 ноя 14, 10:38    [16856862]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Taffy
Member

Откуда:
Сообщений: 20501
Потому что NUMERIC(16,4)
и результат 314.64 аналогичен 314.6400

а как показывать пользователю - вопрос не сервера
17 ноя 14, 10:39    [16856868]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
last_man
Member

Откуда:
Сообщений: 40
так вроде округление справа налево. 6346 -> 635 -> 64

В общем, вопрос решается написанием собственной функции округления?
17 ноя 14, 10:43    [16856901]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
last_man
В общем, вопрос решается написанием собственной функции округления?
Ну если вы решили округлять по своим собственным правилам, то да.
17 ноя 14, 10:44    [16856908]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Glory
Member

Откуда:
Сообщений: 104751
last_man
так вроде округление справа налево

Это где такое округление ?
17 ноя 14, 10:46    [16856915]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
last_man
Member

Откуда:
Сообщений: 40
дело в том, что пользователи выдают представленное выше округление(справа налево) как математическое
Хотя я придерживаюсь другой точки зрения.
17 ноя 14, 10:46    [16856919]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Glory
Member

Откуда:
Сообщений: 104751
last_man
что пользователи выдают представленное выше округление(справа налево) как математическое

Пусть ознакомятся https://ru.wikipedia.org/wiki/Округление
17 ноя 14, 10:47    [16856926]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
last_man
Почему не 314.64?
Потому что 314.6300 ближе к округляемому числу (-0.0046), чем 314.6400 (+0.0054).
В последних версиях можно округлять с третьим параметром <>0.
Тогда будет просто отбрасывать "лишние разряды"
SELECT ROUND(t,2,1)
17 ноя 14, 10:51    [16856946]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
StarikNavy
Member

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

http://msdn.microsoft.com/ru-ru/library/ms175003(v=sql.105).aspx

там и вариант с усечением упомянут
17 ноя 14, 11:20    [16857133]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
last_man
Member

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

автор
В последних версиях можно округлять с третьим параметром <>0.
Тогда будет просто отбрасывать "лишние разряды"


мне вот как раз наоборот, надо учитывать..
так и придется что-то свое сочинять((
17 ноя 14, 14:58    [16859106]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
last_man
так вроде округление справа налево. 6346 -> 635 -> 64

В общем, вопрос решается написанием собственной функции округления?


Это Вы сами придумали такой способ округления :)
На самом деле надо сравнивать остаток после знака, но которого хотите округлить. Остаток 46 в данном случае, он меньше 50, значит отбрасывается.
17 ноя 14, 15:12    [16859243]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
last_man
iap,

автор
В последних версиях можно округлять с третьим параметром <>0.
Тогда будет просто отбрасывать "лишние разряды"


мне вот как раз наоборот, надо учитывать..
так и придется что-то свое сочинять((
Как учитывать-то?
Существует много способов округления: к ближайшему числу, "вниз", "вверх", "банковское округление", наконец!
Из них Microsoft реализовал только два!
17 ноя 14, 15:12    [16859250]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Владислав Колосов
Member

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

PS Вы хотите своим способом как раз накопить ошибку округления. Эта ошибка и дает лишнюю 1.
17 ноя 14, 15:13    [16859256]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
last_man
Member

Откуда:
Сообщений: 40
Владислав Колосов,
я как математик как раз и не понимаю это бухгалтерское округление, если в ндс 4 знака после запятой, то надо учитывать все 4, а не отбрасывать
18 ноя 14, 08:39    [16863015]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
last_man
Member

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

оказывается, никакой способ не округляет как в данном случае, т.е. справа налево, ни округление вверх, ни вниз ,ни случайное, ни банковское, ни чередующееся.
18 ноя 14, 08:58    [16863053]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
o-o
Guest
last_man
так вроде округление справа налево. 6346 -> 635 -> 64
В общем, вопрос решается написанием собственной функции округления?

в таком случае вас спасет двойной ROUND:

declare @r numeric(16,4) = 314.6346;
select ROUND(ROUND(@r, 3), 2), 
       CAST(ROUND(ROUND(@r, 3), 2) as decimal(16,2))
----
314.6400	314.64
18 ноя 14, 11:31    [16863997]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
last_man
Владислав Колосов,
я как математик как раз и не понимаю это бухгалтерское округление, если в ндс 4 знака после запятой, то надо учитывать все 4, а не отбрасывать


Раз вы математик, до должны понимать, как правильно оценить остаток без накопления ошибки :)
18 ноя 14, 11:36    [16864057]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
o-o
Guest
Владислав Колосов
last_man
Владислав Колосов,
я как математик как раз и не понимаю это бухгалтерское округление, если в ндс 4 знака после запятой, то надо учитывать все 4, а не отбрасывать


Раз вы математик, до должны понимать, как правильно оценить остаток без накопления ошибки :)

вы это его пользователям объясните, ТС под их мнением не подписывался.
last_man
дело в том, что пользователи выдают представленное выше округление(справа налево) как математическое
Хотя я придерживаюсь другой точки зрения.
18 ноя 14, 11:40    [16864094]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
last_man
оказывается, никакой способ не округляет как в данном случае, т.е. справа налево, ни округление вверх, ни вниз ,ни случайное, ни банковское, ни чередующееся.

и непонятно зачем кому-то вообще надо было изобретать такой способ округления, какие у него достоинства.
18 ноя 14, 11:47    [16864169]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
Shakill
last_man
оказывается, никакой способ не округляет как в данном случае, т.е. справа налево, ни округление вверх, ни вниз ,ни случайное, ни банковское, ни чередующееся.

и непонятно зачем кому-то вообще надо было изобретать такой способ округления, какие у него достоинства.


Полагаю, что это просто заблуждение относительно округления.
18 ноя 14, 12:08    [16864349]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
PS особенно, если это юристы.
18 ноя 14, 12:09    [16864356]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
o-o
Guest
Shakill
last_man
оказывается, никакой способ не округляет как в данном случае, т.е. справа налево, ни округление вверх, ни вниз ,ни случайное, ни банковское, ни чередующееся.

и непонятно зачем кому-то вообще надо было изобретать такой способ округления, какие у него достоинства.

вот всем не понять, а нам с ТС очень даже.
радуйтесь, что у вас вменяемые пользователи.
я вот товарища по дурдому вижу за версту
ничего вы им не докажете, когда полная невменяемость, это бисер перед свиньями.
...a чтобы понять логику набекрень, надо и мозги иметь свернутые в ту же сторону,
так что лучше и не пытаться
18 ноя 14, 12:11    [16864376]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
last_man
так вроде округление справа налево. 6346 -> 635 -> 64

В общем, вопрос решается написанием собственной функции округления?
Следуя этой логике, 314.634444444445 тогда тоже должно округлиться в 314.64, что мягко говоря весьма странно.
18 ноя 14, 23:41    [16868903]     Ответить | Цитировать Сообщить модератору
 Re: округление Round  [new]
VasilB
Member

Откуда:
Сообщений: 1
o-o
Shakill
пропущено...

и непонятно зачем кому-то вообще надо было изобретать такой способ округления, какие у него достоинства.

вот всем не понять, а нам с ТС очень даже.
радуйтесь, что у вас вменяемые пользователи.
я вот товарища по дурдому вижу за версту
ничего вы им не докажете, когда полная невменяемость, это бисер перед свиньями.
...a чтобы понять логику набекрень, надо и мозги иметь свернутые в ту же сторону,
так что лучше и не пытаться


Стоит попробовать ткнуть пользователя в "ДОКУМЕНТ", а именно: СТАНДАРТ СЭВ СТ СЭВ 543-77 ЧИСЛА Правила записи и округления
(который кстати все еще действующий, хотя принят в 79м году прошлого столетия). Возможно, что официальный документ окажется для них "более авторитетным" нежели просто Ваши утверждения.
27 янв 15, 13:32    [17176345]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить