Обновление точности

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

Внутри AutoNumeric точность представляется набором параметров, которые определяют:

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

Ключевой параметр, отвечающий за точность:

  • decimalPlaces — фиксирует количество знаков после разделителя.

Дополнительно используются связанные настройки:

  • decimalPlacesRawValue — влияет на «сырое» значение;
  • decimalPlacesShownOnBlur — количество знаков при потере фокуса;
  • decimalPlacesShownOnFocus — количество знаков при фокусе;
  • roundingMethod — стратегия округления.

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

Инициализация с фиксированной точностью

При создании экземпляра AutoNumeric точность задаётся через конфигурационный объект:

const element = document.querySelector('#amount');

const anElement = new AutoNumeric(element, {
    decimalPlaces: 2,
    decimalPlacesShownOnFocus: 4,
    decimalPlacesShownOnBlur: 2,
    roundingMethod: AutoNumeric.options.roundingMethod.halfUp
});

В этом случае поле будет отображать значение с двумя знаками после запятой в обычном состоянии и с четырьмя — при фокусе.

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

Динамическое обновление точности через update

AutoNumeric поддерживает изменение параметров уже инициализированного экземпляра через метод обновления настроек.

Основной подход:

anElement.update({
    decimalPlaces: 3
});

После вызова:

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

Это позволяет менять поведение поля на лету, например при переключении валют или режимов отображения.

Влияние изменения точности на текущее значение

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

Уменьшение точности

anElement.set(12.34567);

anElement.update({
    decimalPlaces: 2
});

Результат:

  • значение будет округлено до 12.35 (в зависимости от метода округления);
  • лишние знаки будут отброшены;
  • отображение синхронизируется с новой конфигурацией.

Увеличение точности

anElement.update({
    decimalPlaces: 5
});

Результат:

  • значение 12.35 станет отображаться как 12.35000;
  • внутреннее число не теряет точность хранения;
  • визуальное представление расширяется нулями.

Это важное различие: AutoNumeric не изменяет математическую сущность числа, а изменяет его форматирование.

Синхронизация с режимами focus и blur

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

anElement.update({
    decimalPlacesShownOnFocus: 6,
    decimalPlacesShownOnBlur: 2
});

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

Изменение этих параметров через update сразу влияет на текущее состояние поля без необходимости переинициализации.

Обновление точности через глобальные настройки экземпляра

AutoNumeric позволяет получать экземпляр и изменять его конфигурацию через API:

const anElement = AutoNumeric.getAutoNumericElement('#amount');

anElement.update({
    decimalPlaces: 4
});

Этот подход используется в архитектурах, где инстанс не хранится явно в переменной, а извлекается из DOM-элемента.

Поведение округления при смене точности

При обновлении точности ключевую роль играет параметр округления.

anElement.update({
    decimalPlaces: 2,
    roundingMethod: AutoNumeric.options.roundingMethod.halfEven
});

Типичные стратегии:

  • halfUp — классическое округление;
  • halfEven — банковское округление;
  • floor — округление вниз;
  • ceil — округление вверх.

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

Обновление точности в реактивных интерфейсах

В интерфейсах с динамическими формами точность часто зависит от состояния приложения:

  • выбор валюты;
  • выбор режима налогообложения;
  • переключение между «черновиком» и «финальным расчётом»;
  • изменение настроек пользователя.

Пример сценария:

function setCurrency(currency) {
    if (currency === 'JPY') {
        anElement.update({
            decimalPlaces: 0
        });
    } else {
        anElement.update({
            decimalPlaces: 2
        });
    }
}

При смене валюты поле автоматически адаптируется под правила точности без разрушения DOM-элемента.

Особенности пересчёта при массовом обновлении

Если на странице существует множество полей AutoNumeric, обновление точности может выполняться централизованно:

AutoNumeric.getAutoNumericElements().forEach((an) => {
    an.update({
        decimalPlaces: 3
    });
});

В таких сценариях важно учитывать:

  • перерасчёт может быть затратным при большом количестве полей;
  • визуальное обновление происходит синхронно;
  • возможно кратковременное «перерисовывание» значений.

Конфликты настроек точности

При обновлении параметров возможны конфликты между связанными настройками:

  • decimalPlaces vs decimalPlacesRawValue;
  • shownOnFocus vs shownOnBlur;
  • ограничения минимального и максимального значения.

Например:

anElement.update({
    decimalPlaces: 2,
    minimumValue: "0.000"
});

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

Обновление точности и сохранение пользовательского ввода

При активном вводе пользователя изменение точности может привести к немедленной нормализации значения. Это означает:

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

Для минимизации эффекта обычно применяют обновление точности вне активного фокуса:

if (!anElement.isFocused) {
    anElement.update({ decimalPlaces: 2 });
}

Переключение между режимами высокой и низкой точности

Типовой сценарий — режим «просмотра» и режим «редактирования».

function setViewMode() {
    anElement.update({
        decimalPlaces: 2
    });
}

function setEditMode() {
    anElement.update({
        decimalPlaces: 6
    });
}

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

Производственные ограничения при частых обновлениях

Частое изменение точности может привести к:

  • избыточным перерасчётам DOM;
  • потере производительности при больших формах;
  • конфликтам с другими форматирующими библиотеками.

Поэтому обновление точности обычно группируется:

requestAnimationFrame(() => {
    anElement.update({ decimalPlaces: 4 });
});

или выполняется в рамках батчинга изменений.

Внутреннее поведение пересчёта

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

  • извлечение текущего raw значения;
  • приведение к числовому типу;
  • применение новой конфигурации округления;
  • генерация нового formatted value;
  • обновление DOM-значения;
  • синхронизация внутреннего состояния экземпляра.

Эта цепочка гарантирует согласованность между отображением и логикой.

Влияние точности на сериализацию значения

При получении значения через API:

anElement.getNumber();

результат зависит от текущей точности и настроек rawValue. При изменении decimalPlaces может изменяться и формат возвращаемого значения, особенно если используется строковое представление.


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