Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Math.sumPrecise в ECMAScript 2026: точные суммы без самописных алгоритмов

Math.sumPrecise в ECMAScript 2026: точные суммы без самописных алгоритмов

Запланировано Прикреплена Закрыта Перенесена JavaScript
math.sumpreciseecmascript 2026javascript
1 Сообщения 1 Постеры 56 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал в отредактировано
    #1

    В ECMAScript 2026 появился метод Math.sumPrecise. Он решает проблему неточных сумм с плавающей запятой в JavaScript. Теперь не нужно писать свои алгоритмы для точных вычислений - стандарт берёт это на себя.

    Обычная сумма через цикл или reduce часто даёт ошибки из-за особенностей IEEE 754. Например, большие числа “съедают” мелкие. Math.sumPrecise использует специальный алгоритм, чтобы избежать таких потерь. Это упрощает код и повышает надёжность в финансовых расчётах, статистике и графиках.

    Как работает Math.sumPrecise

    Метод принимает итерируемый объект с числами и возвращает их сумму с повышенной точностью. Он не просто складывает значения по порядку - применяет компенсированный алгоритм суммирования. Это значит, что малые значения не теряются даже при работе с очень большими числами.

    Рассмотрим классический пример проблемы. Возьмём массив [1e20, 0.1, -1e20]. Обычный цикл даст 0, потому что 1e20 + 0.1 округляется до 1e20, а потом вычитается 1e20. Math.sumPrecise учтёт вклад 0.1 и вернёт правильный результат 0.1. Такой подход работает, как если бы числа суммировались математически точно, а потом округлялись до double.

    Но есть нюанс: проблема 0.1 + 0.2 останется, так как литералы уже неточны. Метод не исправляет исходные представления чисел, а только оптимизирует саму сумму. Это важно понимать, чтобы не ждать чудес.

    Вот ключевые особенности метода:

    • Принимает любой итерируемый: массив, Set, генератор.
    • Работает только с числами типа Number (64-битный float).
    • Возвращает NaN, если в iterable есть не-числа или бесконечности с разными знаками.
    • Оптимизирован для больших наборов данных - не хуже reduce по скорости.

    Проблемы обычной суммы и сравнение

    В JavaScript числа хранятся в формате double-precision IEEE 754. Это даёт точность около 15 десятичных знаков, но при суммировании ошибки накапливаются. Особенно заметно, когда числа сильно различаются по порядку.

    Например, в финансовых приложениях сумма мелких транзакций может исчезнуть рядом с крупными. Самописные алгоритмы вроде Kahan summation решают это, но они сложны, медленны и не везде работают идеально. Math.sumPrecise встроен в стандарт и проходит тесты на всех современных движках.

    Сравним производительность и точность в таблице:

    Метод Точность для [1e20, 0.1, -1e20] Скорость на 1M элементов Сложность кода
    Цикл for 0 (потеря 0.1) Быстро Низкая
    Array.reduce() 0 (та же проблема) Быстро Низкая
    Kahan algorithm 0.1 Медленнее Высокая
    Math.sumPrecise 0.1 Быстро Нулевая

    Из таблицы видно: новый метод выигрывает по всем параметрам. Он простой, как reduce, но точный, как самописные решения.

    Примеры использования:

    1. Math.sumPrecise([0.1, 0.2, 0.3]) - сумма с минимальной ошибкой.
    2. Math.sumPrecise(myArray) - для массивов данных из API.
    3. В генераторах: Math.sumPrecise(function*(){ yield* data; }()).

    Примеры кода до и после

    Раньше для точной суммы приходилось реализовывать алгоритмы вручную. Вот типичный Kahan accumulator - 15 строк кода с переменными для ошибки.

    Теперь достаточно одной строки: const total = Math.sumPrecise(numbers);. Это ускоряет разработку и снижает баги. Поддержка уже есть в Chrome, Firefox и Node.js последних версий через флаги или полифиллы.

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

    Код до:

    let sum = 0, error = 0;
    for (let x of numbers) {
      let y = x - error;
      let t = sum + y;
      error = (t - sum) - y;
      sum = t;
    }
    

    Код после:

    const sum = Math.sumPrecise(numbers);
    

    Разница огромная. Плюс метод проходит spec-тесты TC39 и работает от ES3 с полифиллом.

    Преимущества в практике:

    • Меньше кода - на 90% короче аналогов.
    • Стабильность - одинаковый результат везде.
    • Интеграция с async/await и потоками данных.

    Почему это меняет разработку

    Math.sumPrecise закрывает давнюю дыру в JS. Раньше точные расчёты требовали BigDecimal или внешних либ вроде decimal.js. Теперь стандарт даёт решение без зависимостей.

    В ECMAScript 2026 это часть большего апдейта Math: добавлены методы для Float16 и другие улучшения. Для фронтенда, бэкенда и мобильных приложений - универсальный инструмент. Особенно полезно в TypeScript, где типы Number останутся, но точность вырастет.

    Остаётся место для размышлений: как это повлияет на библиотеки вроде D3.js или NumJS? И будет ли расширение на BigInt в будущем. В любом случае, самописные суммы уходят в прошлое.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы