ENote
  • ✨Home
    • Відмова від відповідальності
  • Progr
    • Python
      • Модулі
        • pip
        • cgitb
        • datetime
          • Класс datetime() модуля datetime
            • Методы объекта datetime.datetime()
            • datetime.datetime examples
          • Класс timedelta() модуля datetime
            • datetime.timedelta examples
          • Класс date() модуля datetime
            • datetime.date examples
          • Класс time() модуля datetime
            • Формат для функций .strftime() и .strptime(). модуля datetime
        • os.path
        • pathlib
          • pathlib to str
        • subproces
        • os
        • Jinja
          • Синтаксис шаблонів Jinja
          • Клас Environment()
          • Простой пример cgi-скрипта c Jinja-шаблоном
          • Создание переменных
            • Як оновити глобальну змінну зсередини оператора IF / ELSE або циклу FOR
          • Фільтри і методи
          • Число у рядок, slices
          • Вбудовані фільтри Jinja2
        • re
          • re.search - example
          • re.findall - example
        • email / smtplib
          • Как отправлять электронные письма с помощью Python
        • requests
          • Як зберегти та завантажити файли cookie в запитах Python?
          • Извлечение и установка cookies с модулем requests в Python
          • Links
        • http.cookies
          • Всё о работе с cookie в Python — класс http.cookies
        • xlrd
        • xlwt
        • borb
          • ChunkOfText
          • send_usage_statistics
          • borb clear
          • 2.1.3 vs 2.1.15
          • QR-code
          • Залежності borb
        • JSON
          • Кирилиця в JSON
        • matplotlib
        • argparse
        • click
        • configparser
        • traceback
        • sys
          • exit()
        • mysql-connector-python
        • logging
        • icrawler
        • Auto Plates
        • rembg
        • random
      • Strings
        • Built-in methods
        • Форматування виводу
        • Початкові нулі
        • Рядок в число
      • list
        • Об’єднання списків
        • list.sort(), sorted()
        • list.reverse(), reversed()
        • all(), any()
        • sum(), min(), max()
        • map(), filter(), reduce()
        • join(), split()
      • tuple
      • dict
        • Об'єднання / злиття словників
        • Сортування словника Python: значення, ключі тощо
      • set
      • class Enum
      • Середнє арифметичне
      • Virtual environment
        • web-app
      • type(), isinstance()
      • __main__
      • Files & Dirs
        • Try except for exception handling
        • Cписок файлов директории
        • User Home Dir
        • Copy file
      • *args, **qwargs
      • Links
      • Область видимости
      • Handling a File Error
      • assert
      • if
      • Числа
        • Округлення чисел
        • Отримати число з рядка
      • Обработка исключений в Python
      • Файлы и сериализация данных
      • OOP
      • Net and Web
      • Структура проекта на Python
      • Распаковка итерируемых объектов
      • Links
      • Algorithms
      • Python exit commands: quit(), exit(), sys.exit() and os._exit()
      • Цикли for / while
      • uuid
    • JavaScript
      • String
        • replaceAll() polyfill
        • Шаблонные строки
      • Array
        • Все способы перебора массива в JavaScript
      • Object
      • document.location
      • RegExp
      • Examples
        • Вычисление остатка от деления
        • Остаток от деления и деление без остатка
        • Округление числа
      • XMLHttpRequest
      • alert, prompt, confirm
      • onclick
      • hidden, display:none
      • LocalStorage, sessionStorage
      • null, undefined
      • cookies (js)
      • var, let и const
        • var vs let
        • const
      • Модифікація DOM
        • DOM select
      • JSON
        • Try
      • fetch
      • typeof
      • FormData не включає disabled набори полів
      • FormData, fdata
      • Більше одного відео YouTube на одній сторінці
    • HTML, CSS
      • favicon
      • Деякі спецсимволи
      • meta
      • ASCII table
      • lang
      • Псевдоелементи ::after і ::before
      • Cursor
      • Об использовании нестандартных пробелов
      • Картинка фоном
      • Безпечні веб-шрифти
      • Завжди внизу, незалежно від пропорцій екрану
      • напівпрозорий елемент
      • Символи з тінью
      • SVG (bootstrap)
      • rel = canonical
      • link stylesheet: integrity & crossorigin
      • rel = noopener
    • Bootstrap
      • Form Validate
      • Password show/hide
    • Errors
  • Dev
    • Git
      • clone
      • git-scm (book)
      • git config
        • files .git*
        • core.filemode
        • core.sharedRepository
      • .gitignore
      • .gitkeep
      • Видалити з репозиторію
        • Видалений файл з однієї гілки...
      • Пам’ятка
        • Перегляд історії комітів
        • Скасувати git add
        • revert
        • Скасувати внесені зміни у файл
        • Додати до коміту файл
        • Видалити історію попередніх коммітів, та почати "з нуля"
        • Додати файли в останній коміт
      • Робота з гілками
        • Порівняти гілки
      • Git за полчаса
      • Три розділи проєкту Git
      • Merge conflict
      • Pull error
        • Git Error: You have divergent branches...
      • diff
      • Video
      • Merge скасувати
      • .gitignore: Permission denied
    • GitHub
      • SSH-підключення до GitHub
      • Перенести на сервер локальный репозиторий
      • Перенести на сервер репозиторій разом з історією
      • Створення змісту
    • Security
      • robots.txt
      • Cookies
    • Аутентифікація і cookies
      • ChatGPT
  • data
    • MySQL
      • MyISAM vs InnoDB
      • Типи даних
        • NULL (todo)
        • TIMESTAMP
        • YEAR
        • JSON
        • Требования к памяти для символьных типов
        • Поиск записей в таблице, которым нет соответствия в другой
      • Приклад створення БД, та користувача
        • Права для пользователей
      • Переглянути всі індекси таблиці
      • Копіювання, клонування таблиць
      • TEMPORARY TABLE
      • JOIN
      • ALTER TABLE
      • AUTO_INCREMENT
        • AUTO_INCREMENT у складовому індексі
      • LIMIT
        • Использование MySQL LIMIT
      • 10 Примеров входной загрузки данных из текстового файла в таблицы MySQL
      • Рішення
        • Выявление и удаление несвязанных записей
        • Выборка произвольных записей
        • Коректне сортування українських літер
        • Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
        • Как удобно посмотреть данные...
        • Нахождение "дыр" в нумерации
        • Знайти дубликати полів в одній таблиці
        • Дані колонки 1 табл. перенести в 2 табл.
      • Функції
        • LAST_INSERT_ID()
        • GROUP_CONCAT
        • COUNT + DISTINCT
        • Функции для работы с датами и временем
      • Автоматизируйте создание бэкапов
      • mysqldump
        • Time Zone UTC
      • Результат запиту у файл
      • Результат запиту у змінну
      • Пособие по MySQL на Python
      • Змінні
      • Эмуляция функции row_number() в MySQL
      • Изучаем хранимые процедуры MySQL
      • SELECT DISTINCT
      • Dump всієї бази даних
      • Індекси
      • FOREIGN KEY
      • MAX(), MIN()
      • LENGTH, CHAR_LENGTH
      • Встановлення
    • MariaDB
    • PostgreSQL
      • Работа с базой данных PostgreSQL
      • Работаем с PostgreSQL через командную строку в Linux
    • Domains
      • Життєвий цикл доменів
      • Статус домена
    • SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД
  • Linux
    • DNS
      • Как в DNS прописать 301 редирект
      • mail
        • SPF
          • Mirohost
        • _dmarc _domainkey
        • DKIM
        • Прописати ключі DKIM в exim
        • Листи з неіснуючим адресатом
    • Server
      • Zomro
        • pip
        • SSH-доступ по ключу (zomro)
        • venv
        • UnicodeEncodeError: 'latin-1' codec can't encode character
        • Mail Ports
        • Редірект з SSL-сертификатом на транзитному сайті
        • Редірект з SSL за допомогою .htaccess
      • Створення нового користувача з привілеями sudo в Ubuntu
      • SSH-доступ по ключу
      • Часовий пояс в Ubuntu 20.04
      • SSH-підключення командний рядок
      • Як встановити Python 3.9 (нижчу) на Ubuntu 22.04
      • Автозагрузка сервисов в Ubuntu
      • Підвищення безпеки SSH
      • Ubuntu Server
        • Art 01
    • Commands
      • adduser
      • apt
      • cat
      • ls
      • tar
      • ln
      • find
      • chmod
      • chown
      • mv
      • dig
      • ping
      • passwd
      • htpasswd
      • umask
      • usermode
      • history
      • cmp
      • chattr +i
    • Config
      • Keyboard
      • windows
      • My kbdswtch
      • Затримка при завантаженні системи
      • Files
        • /etc/resolv.conf
        • /boot/grub/grub.cfg
        • .config/user-dir.dirs
        • /etc/fstab
      • Як встановити шрифти
    • Apache
      • Встановлення
      • Подключить виртуальный хост
      • Файл .htaccess
        • Установка индексного файла
        • Фільтр IP-адрес
        • ModRewrite
          • Заборонити доступ за User-Agent
          • Перенаправити на іншу сторінку
          • Додавати слеш до адреси
        • Включити SSI
        • Виконувати скрипти CGI
        • Тимчасовий перехід з одного домену на інший
      • SSI
      • SSL
      • Відключити старт Apache з системою
      • Помилки
        • Скрипт не працює
        • CGI-скрипт не виводить кирилицю
        • Could not reliably determine
        • Permissions are missing on a component of the path
        • Symbolic link not allowed or link target not accessible
      • AddType, AddLanguage, AddCharset
    • Nginx
      • 301 редирект з www. та http: на https://(без www.)domain
    • Soft
      • SublimeText
        • Plugins
      • Firefox
      • Gwenview
      • inkscape
      • Double Commander
      • nano
      • mc
        • Знайти потрібний файл
      • meld / diffuse
      • hexedit
      • Kazam - відео з екрану
      • VeraCrypt
      • XnView MP
      • LibreOffice
      • xdotool
      • System Load Monitor
      • Battery Monitor
      • qBittorrent
    • Перетворення .RPM в .DEB
    • Bash
      • Конкатенация строк в Bash
      • Page
    • Файлові часові позначки в Linux: atime, mtime, ctime
    • Права доступу для файлів і каталогів
    • Зміна паролю root
    • Быстро удалить огромное количество файлов в каталоге
    • Як узнати версію Linux?
    • USB Flash ext4
    • Clear Cache
    • Доступ до спільної папки на Windows
    • Віртуальні консолі TTY1–TTY6
    • APT. Заборона оновлення
  • Різне
    • GitBook
    • Банковское округление
    • Ім’я користувача Youtube
  • Hard
    • Hardware
      • Acer Extensa
      • Таймер Feron TM22
      • WD My Book World Edition 2Tb
        • FTP
        • SSH
          • Проблеми
        • SSHFS
      • Canon PIXMA E3340
      • Термометри
    • Auto
      • Акумулятор
    • Electro
    • USB Flash recovery
Powered by GitBook
On this page
  • Проблемы классического округления
  • Банковское округление
  1. Різне

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

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

Last updated 1 year ago

Проблемы классического округления

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

Если число в десятичной части содержит четверку или меньше, то оно округляется вниз, а если пятерку или больше, то вверх. 4.4 становится просто 4, 4.5 будет округлено до 5. Уверен вам это хорошо знакомо.

Но давайте посмотрим на такое округление с другой стороны. Реально из 10 представленных чисел 5 будут округлены в большую сторону и только 4 в меньшую. На 4.0 округление никак не повлияет:

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

Давайте для примера возьмем множество из 1000 значений от нуля до 99.9 с шагом 0.1: 0.1, 0.2, 0.3 и так далее. То есть мы имеем некий набор чисел с равномерным заполнением. Назовем его идеальным:

Если мы сложим все числа без округления, то получим значение 49 950. А если при сложении мы будем округлять каждое значение, то итоговый результат будет равен 50 000.

Разница небольшая, всего в 50, тем не менее она даёт нам погрешность в одну десятую процента. И это в идеальном наборе чисел.

Набор данных

Без округления

Обычное округление

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

Идеальный

49 950

50 000 0.10%

Теперь давайте также возьмем 1000 чисел, но на этот раз заполнение будет неидеальным. Мы также будем помещать между двумя целыми числами десять дробных значений, но выбирать их будем случайном порядке. Какие-то числа будут повторяться, а какие-то будут пропущены. Например, мы можем встретить два раза 0.1 и при этом не встретить 0.2 и так далее:

Назовём такое множество нормальным. Так как промежуточные значения будут заполняться случайным образом, то и итоговые результаты мы всегда будем получать разные. Дополню табличку данными одного из таких экспериментов:

Набор данных

Без округления

Обычное округление

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

Идеальный

49 950

50 000 0.10%

Нормальный

49 960

50 018 0.14%

Итак, без округления в сумме я получил 49 960, а с округлением 50 018, что в итоге дало погрешность в 0.14%.

Готовясь к этому видео, я провел несколько экспериментов с разным набором данных и получил разброс погрешности от 0.03 до 0.18%, что в среднем стремится примерно к 0.10% как в идеальном случае, но всё же в зависимости от данных мы можем получить и большие показатели.

При этом надо понимать, что погрешность при округлении — это нормально, ведь мы намеренно отсекаем часть данных, а значит точность будет страдать.

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

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

И для того, чтобы снизить погрешность и увеличить точность используют банковское округление, которое также называют конвергентное округление, статистическое, голландское, округление по Гауссу или округление до четного.

И когда мы говорим «до четного» это не просто слова — в них заложен смысл. Давайте возьмем две шкалы: одну от 4 до 5, а вторую от 5 до 6, и применим к этим шкалам банковское округление:

Числа, которые находятся слева и справа от центра, округляются классическим способом. 4.2 до 4-х, 4.9 до 5-и, 5.3 также до 5-и, 5.7 до 6-и — тут всё стандартно.

А вот средние значения: 4.5 и 5.5 надо округлить до ближайшего четного. Так 4.5 будет округлено до 4-х, потому что 4 находится явно ближе, чем 6. А 5.5 будет округлено до 6-и. На этот раз 6 ближе, чем четыре.

И соответственно, если не считать 4.0 и 5.0, на которые округление не действует, то из оставшихся 18 значений, 9 будут округлены в меньшую сторону и 9 в большую. А это значит, что погрешность при суммировании должна уменьшиться. Ведь теперь у нас нет перекоса в какую-либо из сторон.

Давайте посмотрим на нашу таблицу, и я заполнил её значениями, полученными ровно на том же наборе данных, что и для обычного округления:

Набор данных

Без округления

Обычное округление

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

Идеальный

49 950

50 000 0.10%

49 950 0.00%

Нормальный

49 960

50 018 0.14%

49 964 0.03%

И обратите внимание, что при идеальном распределении мы имеем нулевую погрешность, а при нормальном, когда числа выбираются случайно, погрешность составляет всего 0.03% вместо 0.14%.

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

Именно из-за этого банковское округление часто используют в финансовой сфере и некоторых языках программирования, в частности, в Python 3, а также на платформе .Net.

https://shultais.education/blog/banking-rounding
Набор чисел для округления
Классическое округление
Реальное действие классического округления
Идеальное множество чисел
Нормальное множество чисел
Банковское округление в действии