30 июня Ecma ратифицировала ES2026 — семнадцатую редакцию спецификации, в которой представили семь новых фич.
Начнём с той, которую обсуждают меньше остальных. А зря...
Math.sumPrecise
Классическая ошибка в JS:
const cents = Array(10000).fill(0.1);
cents.reduce((a, b) => a + b);
// 1000.0000000001588
Или версия пожёстче:
[1e20, 0.1, -1e20].reduce((a, b) => a + b);
// 0
0.1 просто исчезла. 1e20 + 0.1 теряет дробную часть из-за ограниченной точности IEEE-754. В итоге после вычитания остаётся 0.Теперь:
Math.sumPrecise([1e20, 0.1, -1e20]);
// 0.1
Внутри используется алгоритм Шевчука. Он складывает числа так, как будто считает в точной математике, и округляет только финальный результат.
Но вот что стоит знать до того, как побежите менять все
reduce в проекте:🔴 Math.sumPrecise не исправляет проблему 0.1 + 0.2. Math.sumPrecise([0.1, 0.2]) по-прежнему вернёт 0.30000000000000004. Дело в том, что сами числа 0.1 и 0.2 уже хранятся в памяти не совсем как математические 0.1 и 0.2. Новый метод исправляет накопление ошибок при суммировании, а не способ представления чисел.
🔴 Math.sumPrecise ожидаемо работает медленнее обычного сложения.
🔴 На момент написания поста типов в lib.es*.d.ts ещё нет, в репозитории TypeScript висит issue. Поэтому пока остаются два варианта: расширить интерфейс Math самостоятельно или подождать.
🔴 Math.sumPrecise уже доступен в Baseline 2026. Для старых браузеров можно использовать полифиллы core-js или es-shims (math.sumprecise).
Хотите, разберём остальные новые методы JS на практике? Пишите в комментариях, что рассмотреть следующим 🔽
#af_hard
❤️ Больше рассказываем о работе в IT и Digital в канале Alfa Digital
