Chrome 145: Math.sumPrecise - точные суммы для финансов и ML в JavaScript
-
Chrome 145 принес новый метод Math.sumPrecise(), который решает проблему неточных сумм в JavaScript. Он работает с iterable чисел и возвращает сумму без потерь точности от промежуточных вычислений. Это важно для финансовых расчетов и машинного обучения, где погрешности floating point могут искажать данные.
Обычное сложение в цикле или через reduce() накапливает ошибки округления. Например, сумма [1e20, 0.1, -1e20] дает 0 вместо 0.1. Math.sumPrecise() использует продвинутый алгоритм, чтобы избежать этого. Теперь разработчики получают точные результаты без самописных решений.
Что такое Math.sumPrecise и почему он нужен
JavaScript использует 64-битные числа с плавающей запятой IEEE 754. Они не могут точно представить многие десятичные дроби, как 0.1 или 0.2. При суммировании ошибки накапливаются: 0.1 + 0.2 дает 0.30000000000000004 вместо 0.3. В финансовых приложениях это приводит к расхождениям в копейках, а в ML - к неверным весам моделей.
Метод Math.sumPrecise() принимает iterable (массив, Set или генератор) и суммирует элементы с высокой точностью. Он медленнее обычного сложения, но точнее. Это статический метод Math, вызывается как Math.sumPrecise([1, 2, 3]). Алгоритм минимизирует потерю точности в промежуточных шагах, группируя мелкие и крупные числа.
Вот классический пример проблемы:
let sum = 0; const numbers = [1e20, 0.1, -1e20]; for (const number of numbers) { sum += number; } console.log(sum); // 0 вместо 0.1С Math.sumPrecise():
console.log(Math.sumPrecise([1e20, 0.1, -1e20])); // 0.1- Преимущество 1: Автоматически сортирует числа по модулю для компенсации ошибок.
- Преимущество 2: Работает с любыми iterable, включая BigInt частично.
- Преимущество 3: Не меняет исходные данные - чистая функция без мутаций.
- Нюанс: Медленнее на больших массивах - используйте для точности, а не скорости.
Обычное сложение Math.sumPrecise() Быстрое Медленнее Потери точности Высокая точность Цикл или reduce() Один вызов Пример: 0 Пример: 0.1 Применение в финансовых расчетах
В финтехе суммы транзакций должны быть точными до копейки. Обычные циклы дают расхождения при курсах валют или процентах. Math.sumPrecise() позволяет суммировать списки цен без ошибок. Представьте корзину покупок с тысячами позиций - итоговая сумма будет верной.
Другой кейс - начисление процентов по вкладам. Малые добавки за день накапливаются годами, и погрешность растет. Метод решает это, используя compensated summation. В коде это упрощает валидацию: сумма всех платежей равна балансу.
Практические примеры:
const transactions = [100.1, 200.2, -150.05]; const total = Math.sumPrecise(transactions); // Точно 150.25Для валют:
const rates = [1.2345, 0.9876, 1.1123]; const sumRates = Math.sumPrecise(rates); // Без накопленных ошибок- Кейс 1: Сумма комиссий в торговом боте - точность до 8 знаков.
- Кейс 2: Агрегация отчетов по кварталам - миллиарды без потерь.
- Кейс 3: Конвертация валют с динамическими курсами.
- Совет: Комбинируйте с BigDecimal библиотеками для сверхточности.
Сценарий Проблема без метода Решение с Math.sumPrecise Транзакции Расхождение в копейках Точная сумма Проценты Накопление ошибок Compensated алгоритм Отчеты Различия в Excel Совпадение с сервером Math.sumPrecise в машинном обучении
В ML данные часто включают floats с градиентами и весами. Суммирование батчей может искажать loss function. Math.sumPrecise() дает стабильные результаты при обучении моделей в браузере, как в TensorFlow.js. Это критично для edge-вычислений на устройствах.
При агрегации фич или loss по эпохам погрешность влияет на сходимость. Метод обеспечивает воспроизводимость: один и тот же датасет дает одинаковые метрики. В реальном проекте - сумма вероятностей в softmax без артефактов.
Код для градиентов:
const gradients = [0.0001, -0.0002, 0.00015]; const totalGrad = Math.sumPrecise(gradients); // Точно без roundingДля loss:
const losses = [0.123, 0.456, 0.789]; const avgLoss = Math.sumPrecise(losses) / losses.length;- Кейс 1: Сумма ошибок в батче - стабильная оптимизация.
- Кейс 2: Нормализация фич - точные коэффициенты.
- Кейс 3: Веб-ML на мобильных - меньше артефактов.
- Нюанс: На больших датасетах тестируйте производительность.
Задача ML Обычный reduce() Math.sumPrecise() Loss aggregation Нестабильная сходимость Воспроизводимо Gradient sum Погрешность в 1e-10 Точность до 1e-16 Feature scaling Искажения Линейность Поддержка и переход на новый метод
Chrome 145 первым внедрил Math.sumPrecise() в начале 2026. Firefox 137 и Safari 26.2 последуют позже. Проверяйте поддержку через feature detection. Пока используйте полифиллы из core-js для кросс-браузерности.
В проектах замените reduce() на новый метод в финансовых модулях. Тестируйте на реальных данных - разница видна сразу. Для legacy-кода оставьте фоллбэк.
if (typeof Math.sumPrecise === 'function') { return Math.sumPrecise(numbers); } else { // Полифилл или старый reduce }- Браузеры: Chrome 145+, Firefox 137+, Safari 26.2+.
- Полифилл: core-js/actual/Math.sumPrecise.
- Тест: Сравните с ручным BigDecimal.
Метод не решает все проблемы float, но упрощает жизнь. Дальше ждем Number.fromString и другие точные API. Стоит поэкспериментировать в прототипах.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.