Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
avasylev
Member

Откуда: Lviv
Сообщений: 3
Никак не могу написать функцию "банковского" округления (как Math.Round в .NET) на SQL.
Главная проблема в округлении цыфр одна за одной.
Помогите плиз
27 дек 05, 20:08    [2214497]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Чего? Что за "банковское"? Чем round не угодил?
27 дек 05, 20:42    [2214572]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Max Shtirlic
Member

Откуда:
Сообщений: 68
Если я правиль понял и речь идет о постепенном round каждой цифры с права на лево, то, например, вот так
declare	@Var	numeric(32, 28),
		@StrVar	varchar(32),
		@Scale	smallint	-- Типа до какого знака округлять

select	@Var = 125.2648899, @Scale = 4

/*----------------------------------------------------------------*/

declare	@NowScale smallint

select	@StrVar = cast(@Var as varchar(64))
select	@NowScale = len(@StrVar) - charindex('.', @Var)

while	@NowScale > @Scale
begin
	print	@StrVar
	print	@NowScale
	select	@StrVar = left(@StrVar, len(@StrVar) -2)
		+ case
			when right(@StrVar, 1) > 5 then cast(left((right(@StrVar, 2)), 1) + 1 as varchar)
			else left((right(@StrVar, 2)), 1)
		end
	select	@NowScale = len(@StrVar) - charindex('.', @StrVar)
end
/*----------------------------------------------------------------*/

select	@StrVar
27 дек 05, 20:58    [2214606]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
А чем round не годится-то? Для примера можно было бы с равным успехом и его применить!.. Ничего не понимаю...
27 дек 05, 21:07    [2214618]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Crimean
А чем round не годится-то? Для примера можно было бы с равным успехом и его применить!.. Ничего не понимаю...

Банковское округление отличается от round - иногда дает разные результаты.
28 дек 05, 00:06    [2214811]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
andsm
Банковское округление отличается от round - иногда дает разные результаты.


Вроде при пятерке округляется до ближайшего четного, т.е

2.5 округляется до 2
3.5 округляется до 4
28 дек 05, 10:11    [2215355]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
andsm
Crimean
А чем round не годится-то? Для примера можно было бы с равным успехом и его применить!.. Ничего не понимаю...

Банковское округление отличается от round - иногда дает разные результаты.


да шо вы говорите! а банки-то и не знают!
28 дек 05, 10:35    [2215471]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Петр
Member

Откуда: Москва
Сообщений: 793
а какой тип данных вы округляете?
28 дек 05, 10:44    [2215518]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Crimean
да шо вы говорите! а банки-то и не знают!


Сравни округление в том же VB и TSQL:

VB: Round(1.345, 2) = 1.34 - банковское округление

TSQL: Round(1.345, 2) = 1.35 - арифметическое округление

Банки об этом вряд ли знают - это должны знать мы.
28 дек 05, 10:44    [2215522]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
AndreyF
VB: Round(1.345, 2) = 1.34 - банковское округление
TSQL: Round(1.345, 2) = 1.35 - арифметическое округление


матерь божья... и эти люди...
[censored]
"банковское"... гыгыгыгы! пойду, покажу банкирам!

это называется округление (round) и усечение (truncate)!
вот цитата из BOL, читать ОЧЕНЬ внимательно, начиная с "function"

BOL
ROUND
Returns a numeric expression, rounded to the specified length or precision.

Syntax
ROUND ( numeric_expression , length [ , function ] )

Arguments
numeric_expression

Is an expression of the exact numeric or approximate numeric data type category, except for the bit data type.

length

Is the precision to which numeric_expression is to be rounded. length must be tinyint, smallint, or int. When length is a positive number, numeric_expression is rounded to the number of decimal places specified by length. When length is a negative number, numeric_expression is rounded on the left side of the decimal point, as specified by length.

function

Is the type of operation to perform. function must be tinyint, smallint, or int. When function is omitted or has a value of 0 (default), numeric_expression is rounded. When a value other than 0 is specified, numeric_expression is truncated.
28 дек 05, 11:16    [2215683]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
2 Crimean

Зря смеешься. Термин "Банковское округление" таки существует. И как раз при "Банковском округлении" действует правило округления к ближайщему четному, а не как в арифметическом - к ближайшему большему для ситуации, когда значение находиться ровно "посередине".

RoundTo(1.245, -2) = 1.24 - "Банковское"
RoundTo(1.245, -2) = 1.25 - не "Банковское"
28 дек 05, 11:40    [2215876]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Crimean

матерь божья... и эти люди...
[censored]
"банковское"... гыгыгыгы! пойду, покажу банкирам!


Сходи. Заодно сходи на тот-же яндекс и посмотри там что означает это понятие.
28 дек 05, 11:42    [2215895]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62908
pkarklin
2 Crimean

Зря смеешься. Термин "Банковское округление" таки существует. И как раз при "Банковском округлении" действует правило округления к ближайщему четному, а не как в арифметическом - к ближайшему большему для ситуации, когда значение находиться ровно "посередине".

RoundTo(1.245, -2) = 1.24 - "Банковское"
RoundTo(1.245, -2) = 1.25 - не "Банковское"

К тому же вариантов округления побольше, есть еще и Floor и Ceil, да и Truncate также можно отнести к округлению.
На уровне CPU они даже не различаются и задаются флагом процессора.

Просто некоторые, кроме школьного округления других и не знают.
28 дек 05, 11:51    [2215954]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
1.245 -> 1.24 это TRUNCATE aka учечение - просто отбрасываем лишнее

1.245 -> 1.25 это ROUND aka округление - учитываем "вес" отбрасывамого. если он > 1/2 , то делаем +1 последнему разряду

то, что кто-то ввел термин "банковское" округление и он разошелся по форумам еще не повод забивать на элементарные вещи
28 дек 05, 12:48    [2216346]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
AndreyF
Member

Откуда:
Сообщений: 432
Crimean
1.245 -> 1.24 это TRUNCATE aka учечение - просто отбрасываем лишнее

1.245 -> 1.25 это ROUND aka округление - учитываем "вес" отбрасывамого. если он > 1/2 , то делаем +1 последнему разряду

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


Глупость.

Любое округление это отбрасывание лишнего, все зависит от правил этого отбрасывания. Сравни как работает округление в VB6 и TSQL. Почувствуй разницу.

Или почитай тут:

www.developerguru.net/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8/%D0%92%D1%81%D0%B5%D0%BF%D1%80%D0%BE%D0%BE%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%B2NET/tabid/57/Default.aspx
28 дек 05, 12:58    [2216417]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Crimean
1.245 -> 1.24 это TRUNCATE aka учечение - просто отбрасываем лишнее

1.245 -> 1.25 это ROUND aka округление - учитываем "вес" отбрасывамого. если он > 1/2 , то делаем +1 последнему разряду

то, что кто-то ввел термин "банковское" округление и он разошелся по форумам еще не повод забивать на элементарные вещи
Интересный вопрос - уже с начала этой ветки изучаю.

Считать "банковское" округление просто транкейтом неправильно.

Вот у микрософта есть виды округлений:

How To Implement Custom Rounding Procedures:

Rounding Explained
Rounding Down
Rounding Up
Arithmetic Rounding
Banker's Rounding
Random Rounding
Alternate Rounding

Продолжаю изучать... :-)
28 дек 05, 12:59    [2216431]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
aag
Member

Откуда: Москва
Сообщений: 1955
Ээээ.... не встречал такого термина, но вообще, при слове "банковское" округление, лично я сразу подумал об учете погрешности оного. А не о том в какую сторону круглить.

Nobody faults but mine... (LZ)
28 дек 05, 13:03    [2216449]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Crimean
1.245 -> 1.24 это TRUNCATE aka учечение - просто отбрасываем лишнее

1.245 -> 1.25 это ROUND aka округление - учитываем "вес" отбрасывамого. если он > 1/2 , то делаем +1 последнему разряду

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


Банковское округление:

1.244->1.24
1.245->1.24
1.246->1.25

что, далеко не TRUNCATE!
28 дек 05, 13:04    [2216462]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
http://encycl.accoona.ru/?id=44185
28 дек 05, 13:06    [2216470]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
alexeyvg
Продолжаю изучать... :-)
Вот пример:

Округляем до 1-го знака после запятой:

Банковское:
1.15 --> 1.2
1.25 --> 1.2
1.35 --> 1.4
1.45 --> 1.4
Транкейт:
1.15 --> 1.1
1.25 --> 1.2
1.35 --> 1.3
1.45 --> 1.4
Арифметическое:
1.15 --> 1.2
1.25 --> 1.3
1.35 --> 1.4
1.45 --> 1.5
28 дек 05, 13:06    [2216478]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Ц4
Guest
Странно всё это. меня почему в советской школе учили, что существуют различные варианты округления, в том числе и до ближайшего чётного
28 дек 05, 13:07    [2216486]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Crimean
http://encycl.accoona.ru/?id=44185


Ну да, канечна, именно в толковом словаре и зарыта истина по округлению. ;)
28 дек 05, 13:08    [2216490]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Микрософт про реализации своих ф-ций Round() пишет:

Product            Implementation
----------------- ------------------------------------
Visual Basic 6.0 Banker's Rounding
Excel Worksheet Symmetric Arithmetic Rounding
SQL Server Either Symmetric Arithmetic Rounding
or Symmetric Round Down (Fix)
depending on arguments
Java Math library Asymmetric Arithmetic Rounding
28 дек 05, 13:12    [2216521]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Ага, особенно "Random Rounding" впечатляет.
Это точно банкирам понравится
"Банковское". Гм.
28 дек 05, 13:27    [2216592]     Ответить | Цитировать Сообщить модератору
 Re: "Баковское" округление на T-SQL (как Math.Round в .NET)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
О! Нашел объяснение!

http://subscribe.ru/archive/comp.soft.prog.gurudotnet/200507/12212918.html

Профессинальное программирование на .NET
Банковское округление

Если складывать много чисел, округляя .5 всегда в большую сторону, то возникнет перекос, который будет тем больше, чем больше чисел мы складываем. Банковское округление позволяет минимизировать этот перекос. В этом случае половина округляется к ближайшему четному. Метод Round() класса Math реализует именно банковское округление. В качестве параметра он принимает округляемое значение и, возможно, точность, до которой необходимо выполнить округление. Если точность не указана, то округление выполняется до целого.


Мдя... Ну что можно сказать... Это не то, чтобы смешно... Это уже не смешно...
А насчет того, что это кто-то когда-то притащил в VB (как заказанную кем-то необходимость) и потом стали подавать как крутоту... "Русские все это время использовали карандаш" (ц) известный адигдод...

То, что в ряде случаев "Alternate Rounding" полезно - никто и не спорит. Но вот путать это все с "округлением"...

Просто доцитирую, не комментируя.

Профессинальное программирование на .NET
Почему Round "раундит" "не правильно" или все про округление в .NET
Как Вы думаете, какой результат получится в результате выполнения этого кода:

Console.WriteLine(Math.Round(3.5));
Console.WriteLine(Math.Round(4.5));

Если Вы думаете, что получится 4 и 5, то ошибаетесь. В обоих случаях результатом будет 4. Тот же самый результат Вы получите и в Visual Basic 6.0. В .NET статический метод Round() класса Math округляет половину к ближайшему четному. В школе же нас учили, что половина всегда округляется в большую сторону. Поэтому многие (и я в том числе) очень удивляются, узнав о таком "неправильном" округлении. Часто незнание этого факта может привести к неправильным расчетам, если алгоритмы преполагают "обычное" округление.

Что же это такое? Очередной баг Microsoft? Вовсе нет! Просто существует несколько способов округления.


P.S.Насчет решения задач, в которых участвует округления - так нам в свое время целый курс читали... В том числе и по измерениям и обработке результатов...
28 дек 05, 13:35    [2216640]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить