Что такое банковское округление

Обновлено: 07.05.2024

Все мы знаем, что такое округление. Если кто-то забыл, то округление — это замена числа на его приближённое значение, записанное с меньшим количеством значащих цифр. Если спросить человека с ходу, что получится при округлении 6,5 до целых, он не задумываясь ответит «7». Нас со школы учили, что числа округляются до ближайшего целого большего по модулю числа. То есть, если в округляемом числе дробная часть равна или больше половине разряда целой части, то мы округляем исходное число до ближайшего большего.

Проще говоря:
и т.д.

И вот, выходя из школы и становясь программистами мы зачастую ожидаем того же поведения от наших мощных языков программирования. Совсем забывая, что в школе нас учили «математическому округлению», а на самом деле видов этих округлений намного больше. На одной только википедии можно нарыть вот сколько вариантов округления 0,5 к ближайшему целому числу:

  • Математическое округление
  • Случайное округление
  • Чередующееся округление
  • Банковское округление

А вот «банковское округление» — это уже интересненько. «Почему?» — спросите вы. В дотнете мы часто используем класс Convert, который предоставляет уйму методов для конвертации одного типа данных в другие (не путать с приведением, о нем будет ниже). И вот, оказывается, что при конвертации чисел с плавающей запятой (double, float, decimal) в целочисленный тип int через метод Convert.ToInt32 под капотом работает «банковское» округление. Оно тут используется по умолчанию!

И вроде как незнание этой мелочи сильно не сказывается на вашей работе, но как только вам приходится работать со статистикой и расчетами показателей, базирующихся на куче всяких записей и циферок эта штука вылазит боком. Потому что мы ожидаем (от незнания), что все наши конвертации\округления в расчетах будут работать по правилам «математического» округления. И смотрим как баран на новые ворота на результат округления 6,5, который равен 6.

Первая мысль программиста, который это видит — «Возможно округление работает в обратную сторону, и по правилам округляется до наименьшего числа?», «Может я что-то забыл из школьной математики?». Дальше он идет в google и понимает что, ничего не забыли, и что творится какая-то чернь. На этом шаге ленивый разработчик решит, что это стандартное поведение метода Convert.ToInt32, округлять до наименьшего целого, и забьет на дальнейший поиск. И будет думать, что если Convert.ToInt32(6,5) = 6, то по аналогии Convert.ToInt32(7,5) = 7. Но не тут-то было. Таких разработчиков в дальнейшем судьба бьет по голове пачкой багов от отдела QA.

Дело в том, что «банковское» округление работает чуть хитрее — оно округляет число до ближайшего четного целого числа, а не до ближайшего целого по модулю. Этот тип округления якобы более честный в случае применения в банковских операциях — банки не будут обделять ни себя ни клиентов, из расчета, что операций с четной целой частью, сколько же, сколько и операций с нечетной целой частью. Но как по мне — всё равно мутновато :) Так вот, именно поэтому Convert.ToInt32(6,5) даст результат 6, а результат для Convert.ToInt32(7,5) будет равен 8, а не 7 :)

Что же делать, что бы получить всем привычное «математическое» округления? У методов класса Convert нет дополнительных настроек округления. Оно и верно, ибо класс этот служит в первую очередь не для округления, а для конвертации типов. На помощь нам приходит замечательный класс Math с его методом Round. Но тут тоже будьте аккуратны, ибо по умолчанию этот метод работает так же как и округление в Convert.ToInt32() — по «банковскому» правилу. Однако, это поведение можно изменять с помощью второго аргумента, входящего в метод Round. Так, Math.Round(someNumber, MidpointRounding.ToEven) даст нам дефолтовое «банковское» округление. А вот Math.Round(someNumber, MidpointRounding.AwayFromZero) будет работать по привычным правилам «математического» округления.

И кстати, Convert.ToInt32() не использует под капотом System.Math.Round(). Специально нарыл на github реализацию этого метода — округление считается по остаткам:


И напоследок пару слов о приведении типов:


В этом примере я привожу тип с плавающей запятой (double в данном случае) к целочисленному int. Так вот, при приведении типов к целочисленному вся не целая часть просто отсекается. Соответственно, в данном примере в переменной "intNumber" будет лежать число 6. Никаких правил округления тут нет, просто отсечение всего, что идет после запятой. Помните об этом!

P.P.S. Кстати, в python округление по дефолту работает так же по «банковскому» принципу. Возможно, в вашем языке такая же штука, будьте бдительны с числами :)

Пару месяцев назад нужно было написать на php небольшой скрипт, который должен был подсчитывать большое количество финансовых данных — брать от сумм банковских переводов процент и подсчитывать сумму. При вычислении процентов появлялись суммы с десяти- и стотысячными долями значений, которые при последующем суммировании и округлении давали весьма интересные эффекты. Например, скрипт генерировал отчет, в котором суммы исходные и рассчитанные различались на 10-20 копеек. Начал разбираться с этим, и открыл для себя новый тип окрулегия — банковское округление.




Сначала я пошел неправильным путем — начал прогонять рассчитанные проценты через функцию round. Но это не помогло. Все равно были расхождения на копейки. Пришлось засесть за чтение теории, и всего через 10 минут выяснилось, что для борьбы с такими эффектами применяется метод «бухгалтерского округления», или за рубежом — «bank rounding».

Способ простой — если тысячные доли рубля равны 5, то смотрится цифра перед ней (единицы копеек). Если она четная, то тысячные просто отбрасываются, а если нечетная — то копейки округляются вверх. То есть по сравнению с математическим округлением разница такая (это тестовый массив чисел, подсчитанных руками).

4.565335, // bank: 4.56, math: 4.57
34.565783, // bank: 34.56, math: 34.57
56.355532, // bank: 56.36, math: 56.36
9.4557642, // bank: 9.45, math: 9.45
10.345643, // bank: 10.34, math: 10.35
7.235345, // bank: 7.24, math: 7.24
9.285456, // bank: 9.28, math: 9.29
3.225, // bank: 3.22, math: 3.23
10.25527, // bank: 10.26, math: 10.26
11.41525, // bank: 11.42, math: 11.42
0.105, // bank: 0.10, math: 0.11
0.115, // bank: 0.12, math 0.12

На самом деле, такой подход не снимает проблему округления полностью, а только значительно сокращает вероятность накопления ошибки за счет того, что количество «четных» и «нечетных» сумм статистически примерно одинаково. Но на практике такой точности вполне достаточно. После использования этой функции, по крайней мере видимые расхождения в скрипте прекратились.

Осталось только найти реализацию этой функции в Интернете, и дело сделано. Конечно, алгоритм простейший, но всегда лучше полагаться на чей-то успешный опыт. А вот тут и ждал меня мега облом. Я не нашел реализацию этой функции для PHP! Вернее, нашел одну на StackOverflow, но она работала через преобразование в строку и выделение функцией substr десятых долей суммы. Для друих языков находил реализации через логарифмы.

Меня это не устроило, поэтому написал за минуту свою функцию. Пояснять ее смысла нет, она «прозрачна».

function bank_round ($val)
$tmp = intval (abs ($val) * 100);
if ($tmp % 2 != 0) $tmp +=1;
if ($val < 0) $tmp = 0 — $tmp;
return $tmp / 100;
>

Округление — математическая операция, позволяющая уменьшить количество знаков в числе за счёт замены числа его приближённым значением с определённой точностью.

Содержание

Методы округления

В разных сферах могут применяться различные методы округления. Во всех этих методах «лишние» знаки обнуляют (отбрасывают), а предшествующий им знак корректирует по какому-либо правилу.

  • Округление к ближайшему целому (англ.round ) — наиболее часто используемое округление. Число в десятичной системе округляют до N-ого знака в зависимости от N+1 знака:
    • если N+1 знак < 5, то N-ый знак сохраняют, а N+1 и все последующие обнуляют;
    • если N+1 знак ≥ 5, то N-ый знак увеличивают на единицу, а N+1 и все последующие обнуляют.

    Варианты округления к ближайшему целому

    В данных вариантах изменено правило для случая (N+1)-й знак = 5, а последующие знаки равны нулю.

    • Банковское округление (англ.banker's rounding ) — округление для этого случая происходит к ближайшему чётному. Это позволяет устранить систематическую ошибку округления при суммировании большого количества чисел. То есть, 2,5 → 2, 3,5 → 4.
    • Случайное округление — округление происходит в меньшую или большую сторону в случайном порядке, но с равной вероятностью (может использоваться в статистике).
    • Чередующееся округление — округление происходит в меньшую или большую сторону поочерёдно.

    Во всех этих трёх вариантах, если (N+1)-й знак не равен 5 или последующие знаки не равны нулю, округление происходит по обычным правилам: 2,49 → 2; 2,51 → 3.

    Использование округления

    Округление используется для нескольких целей:

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

    «Антиокругление»

    Довольно часто встречаются злоупотребления некруглыми числами. Например:

    Ссылки

    Литература

    • Генри С. Уоррен, мл.Глава 3. Округление к степени 2 // Алгоритмические трюки для программистов = Hacker's Delight. — М.: «Вильямс», 2007. — С. 288. — ISBN 0-201-91465-4

    Wikimedia Foundation . 2010 .

    Полезное

    Смотреть что такое "Правила округления" в других словарях:

    СТО-ГК Трансстрой 002-2006: Правила построения, изложения, оформления и обозначения при разработке стандартов организации Группы компаний "Трансстрой" — Терминология СТО ГК Трансстрой 002 2006: Правила построения, изложения, оформления и обозначения при разработке стандартов организации Группы компаний "Трансстрой": 5.13 Методы контроля (испытаний, определений, измерений, анализа)… … Словарь-справочник терминов нормативно-технической документации

    Округление — математическая операция, позволяющая уменьшить количество знаков в числе за счёт замены числа его приближённым значением с определённой точностью. Содержание 1 Методы 1.1 Варианты округления 0,5 к ближайшему целому … Википедия

    Прографка — часть хвоста таблицы, совокупность ее граф без боковика. П. осн. часть таблицы, где расположены данные, составляющие ее содержание. Требования к редакционному оформлению этих данных: 1) выносить данные, общие для каждого элемента графы, в ее… … Издательский словарь-справочник

    Тысяча (игра) — Тысяча взяточная карточная игра для двух, трех или четырех игроков, целью которой является набрать 1000 очков. Особенностью игры является использование так называемых «марьяжей» (король и дама одной масти), которые позволяют назначать… … Википедия

    Поземельная община — Содержание: I. П. община в Западной. Европе. II. П. община в Византии. III. П. община во внеевропейских странах. IV. П. община в Древней Руси и в Великороссии. V. П. община в Малороссии и в Литве. VI. П. община (современное положение; вопрос о П … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона

    Поземельная община — Содержание: I. П. община в Западной. Европе. II. П. община в Византии. III. П. община во внеевропейских странах. IV. П. община в Древней Руси и в Великороссии. V. П. община в Малороссии и в Литве. VI. П. община (современное положение; вопрос о П … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона

    АРИФМЕТИКА — искусство вычислений, производимых с положительными действительными числами. Краткая история арифметики. С глубокой древности работа с числами подразделялась на две различные области: одна касалась непосредственно свойств чисел, другая была… … Энциклопедия Кольера

    Часы прибор для измерения времени — Содержание: 1) Исторический очерк развития часовых механизмов: а) солнечные Ч., b) водяные Ч., с) песочные Ч., d) колесные Ч. 2) Общие сведения. 3) Описание астрономических Ч. 4.) Маятник, его компенсация. 5) Конструкции спусков Ч. 6) Хронометры … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона

    Часы — Содержание. 1) Исторический очерк развития часовых механизмов: а) солнечные Ч., b) водяные Ч., с) песочные Ч., d) колесные Ч. 2) Общие сведения. 3) Описание астрономических Ч. 4.) Маятник, его компенсация. 5) Конструкции спусков Ч. 6) Хронометры … Энциклопедический словарь Ф.А. Брокгауза и И.А. Ефрона

    РБ 039-07: Обеспечение безопасности при транспортировании радиоактивных материалов (Справочный материал к Правилам безопасности при транспортировании радиоактивных материалов, НП-053-04) — Терминология РБ 039 07: Обеспечение безопасности при транспортировании радиоактивных материалов (Справочный материал к Правилам безопасности при транспортировании радиоактивных материалов, НП 053 04): 1. А1 1 С1. Определение соответствует… … Словарь-справочник терминов нормативно-технической документации

    Округляя числа, последняя сохраненная цифра должна быть увеличена на 1, если первая отброшенная цифра больше 5. Например, если оставить только два десятичных знака, то 6.4872 станет 6.49. Точно так же 6.997 становится 7.00.

    Аналогично, что такое 0.8637, округленное до сотых? Номер 0.87 составляет 0.8637, округляя до сотых в большую сторону, но так как число в тысячном разряде меньше 5, число следует округлить в меньшую сторону. 17.

    Что можно округлить до 78000? Номер 77,777 на 223 меньше, чем 78,000 78,000. Это будет очень близко к 78,000 10 на числовой прямой и округляется до XNUMX XNUMX. XNUMX.

    Похожие страницы:Блог

    Какие есть 3 вида налогов?

    Как найти среднюю точку между двумя точками?

    Как вы делаете кадровые прогнозы?

    Как найти начальную скорость, зная только время?

    Каковы правила округления? Вот общее правило округления:

    • Если после округляемого числа следует 5, 6, 7, 8 или 9, округлите число в большую сторону. Пример: 38 с округлением до ближайших десяти - 40.…
    • Если после округляемого числа идут 0, 1, 2, 3 или 4, округлите число в меньшую сторону. Пример: 33 с округлением до ближайших десяти - 30.

    Во-вторых, до чего округляется 750? 750 ровно на полпути между 700 и 800, а 791 находится между 750 и 800. Таким образом, 791 ближе к 800, чем 700 на числовой прямой, и оно округляется до 800.

    Чему равно данное число 78000?

    78,000 77999 (семьдесят восемь тысяч) — четное пятизначное составное число, расположенное между числами 78001 7.8 и 10 XNUMX. В научной записи оно записывается как XNUMX × XNUMX. 4 . Сумма цифр - 15.
    .
    Делители 78000.

    Четные делители 64
    4k + 1 делителя 8
    4k + 3 делителя 8

    тогда как округлить число до ближайших 100000? Чтобы округлить число до ближайших 100,000 XNUMX, проверьте цифру десять тысяч, чтобы решить нужно ли округлять в большую или меньшую сторону. Если десять тысяч составляют 50,000 49,999 или больше, округляем в большую сторону. Если они составляют 450,000 100,000 или меньше, округлите в меньшую сторону. 500,000 XNUMX с точностью до XNUMX XNUMX равно XNUMX XNUMX.

    Как округлить число до наибольшего разряда? Обычно числа округляются в научном представлении, и когда вы округляете до наибольшего разряда, вы округляете цифру перед запятой и опускаете все остальные цифры.

    Почему мы округляем 5?

    Всякий раз, когда десятичное значение, которое вы собираетесь округлить, равно 5, вы должны смотреть на предыдущие значения, ТАКЖЕ перед десятичными знаками. Если это четное число, то округляем его в меньшую сторону, а если нечетное — в большую.

    Как округлить до наибольшего разряда? При округлении до наибольшего разряда вы в основном держи один номер - самый дальний ненулевой слева - и вы обнуляете все числа справа от него.

    Что такое округляющая рифма?

    Округлая рифма- Четыре или меньше, дайте ему отдохнуть, пять или больше, пусть это болит. Четыре или меньше let is rest и Five or more let it soar — отличные рифмы с округлением, помогающие учащимся запомнить правила округления. Повесьте эти плакаты в своем классе или даже сделайте копии, чтобы учащиеся вклеили их в свои тетради! Наслаждаться!

    Как округлить 26? Это то же самое, что 26+? знак равно 73. Сначала округлим 26 до ближайших 10, что равно 30.

    Какое значение от 38 до ближайшей сотни?

    Число равно 3. 3. Поскольку это число меньше 5, мы округляем число в меньшую сторону, т.е. округляем его до ближайших 100, следующих за этим числом. Таким образом, 38 становится 00, что при добавлении к 7 по сотням становится 700.

    Какая ближайшая сотня из 372?

    2,372 можно округлить до ближайшей сотни, взяв сотую часть и округлив до ближайшего числа. обычно 50 является точкой отсечки, поэтому, если число 372 или просто 72 больше 50, то округленное число 400.

    Что такое округление в математике? Что такое округление? Округление означает, что число стало проще, сохранив его значение без изменений, но ближе к следующему числу. Это делается для целых чисел, а также для десятичных знаков в различных местах, таких как сотни, десятки, десятые доли и т. Д. Округление чисел выполняется для сохранения значащих цифр.

    Как округлить до ближайшей тысячи? Чтобы округлить до ближайшей тысячи, смотрим на последние три цифры. Если эти цифры 500 или больше, то мы округляем цифру тысяч в большую сторону, а если они меньше 500, мы округляем в меньшую сторону, сохраняя цифру тысячи неизменной.

    Как округлить каждое число до разряда подчеркнутой цифры?

    Чему равно 4358 с точностью до тысячи? Округлите число 4358 до ближайшей тысячи.

    Так как 3 меньше 5, следовательно, 4358 будет округлено до 4000.

    Какое число округляется до 15000?

    Следовательно, число 14579 округляется до ближайших тысяч как 15000.

    Каким образом число 85642 округляется до ближайших тысяч? 85600.

    Как округлить до наибольшего разряда в Excel?

    Щелкните ячейку, в которую вы хотите поместить округленный результат. Направляйтесь к Формулы> Математика и триггеры, а затем выберите функцию «ОКРУГЛВВЕРХ» или «ОКРУГЛВНИЗ» в раскрывающемся меню. Введите число (или ячейку), которое вы хотите округлить, в поле «Число».

    Нужно ли округлять 0.5 в большую или меньшую сторону? И ответ в том, что он ближе к 1.0. Следовательно, в реальных ситуациях, а также в ситуациях с реальными числами 0.5 должно быть округлено ВВЕРХ потому что мы не должны предполагать, что цифр больше нет. Учитывая это предположение — что где-то справа больше цифр — округление всегда имеет смысл!

    5 округляется вверх или вниз?

    Правило, которое вам нужно запомнить, звучит так: «Если цифра меньше 5, предыдущую цифру округлить вниз; если это 5 или больше, округлите предыдущую цифру в большую сторону ». Округлить цифру в меньшую сторону - значит оставить ее без изменений; округлить цифру в большую сторону - значит увеличить ее на одну единицу.

    Можно ли округлить до 5? Если число округляется без указания вверх или вниз, правилом является число с десятичным знаком . 5 или больше округляется, число с десятичной дробью меньше. 5 округляется вниз.

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

    В различных сферах округление происходит по-разному. Вот те самые шесть способов, о которых говорится в названии:

    1. Округление к ближайшему целому используется наиболее часто и ему учат в школе. Необходимо просто посмотреть на последний знак числа:

    2. Округление к большему (округление вверх) зачастую называется округлением кредитора или продавца.

    3. Округление к меньшему , которое называется округлением дебитора или покупателя . Чаще всего с таким округлением можно встретиться при торговле на рынке и благосклонной скидке от продавца.

    4. Округление к большему по модулю (округление от нуля). Этот метод округления используется довольно редко. Вот как это выглядит:

    5. Округление к меньшему по модулю (округление к нулю). Очевидно, является самым простым типом округления и заключается в отбрасывании знаков:

    6. Случайное округление. Естественно, что при каждом округлении накапливаются ошибки, поэтому случайное округление вверх или вниз позволяет придать их величине нулевое математическое ожидание.

    7. Чередующееся округление - вот именно оно чаще всего применяется в практических задачах, когда необходимо округлять числа n целых 5 десятых. Например, если мы будем в каком-нибудь бухгалтерском отчете всё время пользоваться строгим математическим округлением вверх (т.е. 3,5 = 4), то дебит с кредитом однозначно в итоге не сведем.

    Если в отчете будет 10000 строк, то в нём будет примерно 1000 строк, на конце которых будет "50 копеек". В итоге различие составит целых 50 рублей.

    Чтобы совсем минимизировать ошибку, один раз программа будет округлять вверх, а один раз - вниз. Итоговая погрешность составит максимум 50 копеек. С этим уже можно жить! Спасибо за внимание! Надеюсь, в статье было что-то новенькое и интересное для Вас!

    Автор статьи

    Куприянов Денис Юрьевич

    Куприянов Денис Юрьевич

    Юрист частного права

    Страница автора

    Читайте также: