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

Math.sumPrecise в ECMAScript 2026: точные суммы без самописных функций

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

    Math.sumPrecise - это новая функция в ECMAScript 2026, которая решает проблему неточных сумм с плавающей запятой. Она принимает итерируемый объект чисел и возвращает их сумму с повышенной точностью, используя специализированный алгоритм. Это избавляет от необходимости писать свои polyfill или обходить ошибки IEEE 754.

    Зачем это нужно? В JavaScript простая сумма в цикле или через reduce часто дает неверные результаты из-за особенностей представления чисел. Например, при сложении больших и малых значений мелкие теряются. Math.sumPrecise работает так, будто суммирует точные математические значения, а потом округляет финальный результат до ближайшего double. Полезно для финансовых расчетов, научных вычислений и любых задач, где важна точность.

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

    Math.sumPrecise() - статический метод объекта Math. Он берет iterable чисел, таких как массив или генератор, и суммирует их точно. Алгоритм учитывает порядок и точность каждого слагаемого, избегая накопления ошибок на промежуточных шагах. Это не магия - просто умный способ компенсации погрешностей floating point.

    Возьмем классический пример: массив [1e20, 0.1, -1e20]. Обычный цикл даст сумму 0, потому что 1e20 + 0.1 округляется до 1e20, а потом минус 1e20 обнуляет все. Math.sumPrecise сохранит 0.1 и выдаст правильный результат 0.1. Еще один кейс - аппроксимация числа e через ряд Тейлора. Обычный reduce покажет ошибку, а новая функция - почти ноль.

    Вот демонстрация на коде:

    // Плохая сумма
    let sum = 0;
    const numbers = [1e20, 0.1, -1e20];
    for (const num of numbers) {
      sum += num;
    }
    console.log(sum); // 0
    
    // Точная сумма
    console.log(Math.sumPrecise(numbers)); // 0.1
    
    • Преимущество 1: Работает с любыми iterable, включая генераторы и Set.
    • Преимущество 2: Не меняет исходные данные, чистая функция.
    • Преимущество 3: Соответствует спецификации TC39, предсказуемо везде.
    • Нюанс: Не решает проблему 0.1 + 0.2 = 0.30000000000000004, т.к. это изначально неточные литералы.

    Сравнение с обычными методами

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

    Рассмотрим таблицу сравнения на примере ряда для e (20 членов):

    Метод Результат Ошибка относительно Math.E
    Цикл for 2.7182818284590455 4.44e-16
    Array.reduce() 2.7182818284590455 4.44e-16
    Math.sumPrecise() 2.718281828459045 0

    Генератор для ряда:

    function* sequenceOfE() {
      let member = 1;
      yield member;
      for (let i = 1; i < 20; ++i) {
        member /= i;
        yield member;
      }
    }
    
    • Цикл: Простой, но неточный для чувствительных задач.
    • Reduce: Удобный, но те же проблемы с floating point.
    • Math.sumPrecise: Идеален для точности, поддержка растет.

    Важно: На март 2026 поддержка ограничена, проверяйте caniuse перед продакшеном.

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

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

    Пример финансовой суммы:

    const transactions = [1000.1, -999.9, 0.01, 0.02];
    const total = Math.sumPrecise(transactions);
    console.log(total); // 0.23, а не 0.2 или 0.24
    

    Другой случай - статистика:

    const data = [1e-10, 1e-10, 1e-10]; // Малые вероятности
    console.log(data.reduce((a, b) => a + b, 0)); // 3e-10 с ошибкой
    console.log(Math.sumPrecise(data)); // Максимально точно
    
    • Финтех: Сумма мелких платежей без расхождений.
    • Наука: Аппроксимации констант и рядов.
    • Данные: Агрегация больших датасетов.
    • Игры: Физические симуляции с накоплением.

    Совет: Для обратной совместимости используйте polyfill с GitHub, пока движки догоняют.

    Что скрывает точная сумма

    Math.sumPrecise входит в ECMAScript 2026 вместе с другими улучшениями Math и TypedArray. Это шаг к зрелому JS для численных методов. Но остаются вопросы: как она поведет себя с NaN или Infinity? Спецификация четка - возвращает NaN при наличии нечисловых значений.

    Поддержка в Chrome, Firefox и Node растет, но на старте Stage 4 нужна осторожность. Стоит поэкспериментировать в консоли, чтобы увидеть разницу. Дальше ждем похожих методов вроде sumFast для скорости.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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