roundingMethod

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

Любая система числового форматирования сталкивается с проблемой несоответствия между внутренним представлением числа (IEEE 754 floating point) и требуемым пользовательским отображением. При этом AutoNumeric выполняет двойную функцию:

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

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

Общая роль roundingMethod

Параметр roundingMethod определяет алгоритм, по которому AutoNumeric приводит значение к допустимой точности. Он влияет на:

  • обработку лишних десятичных знаков;
  • поведение при потере точности;
  • правила округления при вводе и при программной установке значения;
  • результат функций сериализации (getNumericString, getNumber, set).

В отличие от простого toFixed, механизм AutoNumeric учитывает контекст ввода и может применять различные стратегии в зависимости от конфигурации.

Основные стратегии округления

В AutoNumeric используются несколько логических моделей округления, каждая из которых ориентирована на определённые бизнес-задачи.

Округление по математическому правилу (half-up)

Наиболее распространённый вариант — округление «вверх от 0.5». Логика проста:

  • если дробная часть ≥ 0.5 — число увеличивается;
  • если < 0.5 — число уменьшается.

Пример поведения:

  • 1.234 → 1.23 (при precision 2)
  • 1.235 → 1.24

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

Банковское округление (half-even)

Более строгая математическая стратегия, часто называемая «банковским округлением». Её цель — минимизировать систематическую погрешность при большом количестве операций.

Правило:

  • если число ровно посередине (например, 2.345 при precision 2):

    • округление идёт к ближайшему чётному числу.

Примеры:

  • 2.345 → 2.34 (так как 4 — чётное)
  • 2.355 → 2.36 (так как 6 — чётное)

Этот метод широко используется в бухгалтерии, банковских расчётах и статистике, где критично снижение накопленной ошибки.

Округление вверх (ceiling)

Стратегия всегда округляет число в сторону увеличения (в сторону +∞), независимо от дробной части.

Примеры:

  • 1.231 → 1.24
  • -1.231 → -1.23

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

Округление вниз (floor)

Противоположный метод — всегда округляет в сторону уменьшения (в сторону -∞).

Примеры:

  • 1.239 → 1.23
  • -1.239 → -1.24

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

Усечение без округления (truncate)

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

Примеры:

  • 1.239 → 1.23
  • 1.235 → 1.23

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

Поведение при вводе пользователя

AutoNumeric применяет roundingMethod не только при программных операциях, но и во время ввода. Это означает, что:

  • при превышении допустимого количества знаков округление происходит немедленно;
  • курсор остаётся в корректной позиции после преобразования;
  • значение в input всегда соответствует внутреннему состоянию экземпляра AutoNumeric.

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

Влияние на методы получения значения

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

  • getNumber() — возвращает число JavaScript с уже применённым округлением;
  • getNumericString() — строковое представление без форматирования, но с учётом округления;
  • getFormatted() — отображаемое значение с разделителями и символами валют.

Во всех случаях стратегия roundingMethod определяет финальное значение, которое возвращается наружу.

Взаимодействие с precision и decimal places

Параметр округления тесно связан с точностью:

  • decimalPlaces задаёт максимальное количество знаков;
  • roundingMethod определяет способ приведения числа к этой точности.

При совместной работе этих параметров формируется итоговая модель поведения:

  • сначала определяется необходимость округления;
  • затем применяется выбранный алгоритм;
  • после этого число нормализуется для отображения.

Особенности отрицательных чисел

Одним из наиболее сложных аспектов является работа с отрицательными значениями. Разные стратегии ведут себя по-разному:

  • half-up может давать симметричное округление;
  • ceiling и floor ведут себя асимметрично;
  • truncate игнорирует знак при отсечении дробной части, но сохраняет его.

Это особенно важно при финансовых расчётах, где ошибка в знаке может привести к некорректному балансу.

Сценарии применения различных стратегий

Выбор метода округления обычно определяется бизнес-логикой:

  • финансовые системы с минимизацией ошибки → half-even;
  • пользовательские интерфейсы и калькуляторы → half-up;
  • системы ограничений и лимитов → floor;
  • системы начислений и штрафов → ceiling;
  • протоколы обмена данными → truncate.

Внутренние механизмы применения

При изменении значения AutoNumeric выполняет последовательность операций:

  1. Парсинг входной строки;
  2. Преобразование в числовое значение;
  3. Проверка на допустимое количество знаков;
  4. Применение roundingMethod;
  5. Нормализация результата;
  6. Обновление отображения.

Этот цикл повторяется при каждом изменении значения, что обеспечивает консистентность данных в интерфейсе.

Связь с локализацией и форматированием

Хотя roundingMethod не зависит напрямую от локали, его результат влияет на финальное отображение, которое уже учитывает:

  • разделитель дробной части;
  • разделитель тысяч;
  • позицию валютного символа;
  • правила группировки чисел.

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