Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Bankers' Rounding / 8 сообщений из 8, страница 1 из 1
11.10.2005, 12:49
    #33317122
Sam Andrews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
кто-нить сталкивался?

с уважением...
...
Рейтинг: 0 / 0
11.10.2005, 13:57
    #33317420
Bankers' Rounding
все сталкивались, кто с VBA дело имел. Тама так к целым приведение идет
CInt, CLng
...
Рейтинг: 0 / 0
11.10.2005, 16:59
    #33318030
Sam Andrews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
была одна проблема с пониманием результатов вот этого
Код: plaintext
1.
2.
Round( 1 . 345 ,  2 ) =  1 . 34 
Round( 2 . 345 ,  2 ) =  2 . 35 
Round( 3 . 345 ,  2 ) =  3 . 34 
в VBS, но разобрался...

с уважением...
...
Рейтинг: 0 / 0
12.10.2005, 04:29
    #33318668
Bankers' Rounding
Так или иначе, с явлением сталкивались все, кто имел дело с x86 -- это его естественное поведение при округлении к ближайшему целому. Только "целое" на самом деле не просто ближайшее, а ближайшее чётное ! Так уж сопроцессор устроен.

А вот примеры т. Sam Andrews'а, извините, слегка странноватые... Может, всё-таки строчка
Код: plaintext
1.
Round( 2 . 345 ,  2 )
даст нам 2.34, а?

Ниже -- более показательные примеры, где числа отличаются не целой частью, что в данном случае (округляем-то до сотой!) -- до самого фонаря, а чётностью самой сотой.
Код: plaintext
1.
2.
3.
4.
SELECT
ROUND( 1 . 345 ,  2 ),
ROUND( 1 . 355 ,  2 ),
ROUND( 1 . 365 ,  2 )
И результаты:
Код: plaintext
1.
2.
3.
ROUND( 1 . 345 ,  2 ) =  1 . 34 
ROUND( 1 . 355 ,  2 ) =  1 . 36 
ROUND( 1 . 365 ,  2 ) =  1 . 36 
Кстати, примерчик из MS Jet.
А вот так я избавляюсь от этой прелести:
Код: plaintext
1.
ROUND({fn FLOOR((XXXXX +  0 . 005 )* 100 )}* 0 . 01 ,  2 )
Тут XXXXX -- подлежащее обычному, не банкирскому, округлению...
...
Рейтинг: 0 / 0
12.10.2005, 13:07
    #33319808
Sam Andrews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
Дядя СерёжаА вот примеры т. Sam Andrews'а, извините, слегка странноватые... Может, всё-таки строчка
Код: plaintext
1.
Round( 2 . 345 ,  2 )
даст нам 2.34, а?

вот в том-то и загвоздка =) почему я и интересовался, любой желающий может исполнить этот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
<script language="VBScript"> 
Function TestVB()
  MsgBox(Round( 1 . 345 ,  2 ))
  MsgBox(Round( 2 . 345 ,  2 ))
  MsgBox(Round( 3 . 345 ,  2 ))
End Function
</script>

ЗЫ: загадка легко расскроется, если произвести умножение 2.345 на 1000...
...
Рейтинг: 0 / 0
12.10.2005, 13:10
    #33319826
Sam Andrews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
сорри, про умножение это не сюда...=)
это к джабаскрипту...

с уважением...
...
Рейтинг: 0 / 0
14.10.2005, 09:53
    #33324159
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
Дядя СерёжаТак или иначе, с явлением сталкивались все, кто имел дело с x86 -- это его естественное поведение при округлении к ближайшему целому. Только "целое" на самом деле не просто ближайшее, а ближайшее чётное ! Так уж сопроцессор устроен.
Дело имхо не в сопроцессоре, а в принципе. То есть сопроцессор устроен так, потому что это округление было заложено в нем, а не наоборот :)

Немного погуглив:
авторЕсли складывать много чисел, округляя .5 всегда в большую сторону, то возникнет перекос, который будет тем больше, чем больше чисел мы складываем. Банковское округление позволяет минимизировать этот перекос http://subscribe.ru/archive/comp.soft.prog.gurudotnet/200507/12212918.html

автор в статье от Майкрософта:
http://support.microsoft.com/default.aspx?scid=kb;en-us;196652
(см. раздел "The Round() Function is Inconsistently Implemented", где написано, что в VB6/VBA применяется т.н. "банковское округление", цель которого - как написано двумя разделами выше - минимизировать "bias", ошибку, набегающую при сложении нескольких округляемых чисел). http://relib.com/forums/thread865603.aspx
...
Рейтинг: 0 / 0
14.10.2005, 11:45
    #33324559
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bankers' Rounding
Речь идет о так называемом "округлении по Гауссу", не так ли ? Статистически оно дает значительно меньшую погрешность на т.н. "массовых" операциях: начисление процентов по вкладам, переоценка и т.п. Очень хорошее описание вот тут: http://www.xbeat.net/vbspeed/i_BankersRounding.htm
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Bankers' Rounding / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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