<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Math.sumPrecise в ECMAScript 2026: точные суммы без самописных алгоритмов]]></title><description><![CDATA[<p dir="auto">В ECMAScript 2026 появился метод <strong>Math.sumPrecise</strong>. Он решает проблему неточных сумм с плавающей запятой в JavaScript. Теперь не нужно писать свои алгоритмы для точных вычислений - стандарт берёт это на себя.</p>
<p dir="auto">Обычная сумма через цикл или reduce часто даёт ошибки из-за особенностей IEEE 754. Например, большие числа “съедают” мелкие. <strong>Math.sumPrecise</strong> использует специальный алгоритм, чтобы избежать таких потерь. Это упрощает код и повышает надёжность в финансовых расчётах, статистике и графиках.</p>
<h2>Как работает Math.sumPrecise</h2>
<p dir="auto">Метод принимает итерируемый объект с числами и возвращает их сумму с повышенной точностью. Он не просто складывает значения по порядку - применяет <em>компенсированный алгоритм суммирования</em>. Это значит, что малые значения не теряются даже при работе с очень большими числами.</p>
<p dir="auto">Рассмотрим классический пример проблемы. Возьмём массив [1e20, 0.1, -1e20]. Обычный цикл даст 0, потому что 1e20 + 0.1 округляется до 1e20, а потом вычитается 1e20. <strong>Math.sumPrecise</strong> учтёт вклад 0.1 и вернёт правильный результат 0.1. Такой подход работает, как если бы числа суммировались математически точно, а потом округлялись до double.</p>
<p dir="auto">Но есть нюанс: проблема 0.1 + 0.2 останется, так как литералы уже неточны. Метод не исправляет исходные представления чисел, а только оптимизирует саму сумму. Это важно понимать, чтобы не ждать чудес.</p>
<p dir="auto">Вот ключевые особенности метода:</p>
<ul>
<li>Принимает любой итерируемый: массив, Set, генератор.</li>
<li>Работает только с числами типа Number (64-битный float).</li>
<li>Возвращает NaN, если в iterable есть не-числа или бесконечности с разными знаками.</li>
<li><em>Оптимизирован для больших наборов данных</em> - не хуже reduce по скорости.</li>
</ul>
<h2>Проблемы обычной суммы и сравнение</h2>
<p dir="auto">В JavaScript числа хранятся в формате double-precision IEEE 754. Это даёт точность около 15 десятичных знаков, но при суммировании ошибки накапливаются. Особенно заметно, когда числа сильно различаются по порядку.</p>
<p dir="auto">Например, в финансовых приложениях сумма мелких транзакций может исчезнуть рядом с крупными. Самописные алгоритмы вроде Kahan summation решают это, но они сложны, медленны и не везде работают идеально. <strong>Math.sumPrecise</strong> встроен в стандарт и проходит тесты на всех современных движках.</p>
<p dir="auto">Сравним производительность и точность в таблице:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Точность для [1e20, 0.1, -1e20]</th>
<th>Скорость на 1M элементов</th>
<th>Сложность кода</th>
</tr>
</thead>
<tbody>
<tr>
<td>Цикл for</td>
<td>0 (потеря 0.1)</td>
<td>Быстро</td>
<td>Низкая</td>
</tr>
<tr>
<td>Array.reduce()</td>
<td>0 (та же проблема)</td>
<td>Быстро</td>
<td>Низкая</td>
</tr>
<tr>
<td>Kahan algorithm</td>
<td>0.1</td>
<td>Медленнее</td>
<td>Высокая</td>
</tr>
<tr>
<td><strong>Math.sumPrecise</strong></td>
<td><strong>0.1</strong></td>
<td><strong>Быстро</strong></td>
<td><strong>Нулевая</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">Из таблицы видно: новый метод выигрывает по всем параметрам. Он простой, как reduce, но точный, как самописные решения.</p>
<p dir="auto">Примеры использования:</p>
<ol>
<li><code>Math.sumPrecise([0.1, 0.2, 0.3])</code> - сумма с минимальной ошибкой.</li>
<li><code>Math.sumPrecise(myArray)</code> - для массивов данных из API.</li>
<li>В генераторах: <code>Math.sumPrecise(function*(){ yield* data; }())</code>.</li>
</ol>
<h2>Примеры кода до и после</h2>
<p dir="auto">Раньше для точной суммы приходилось реализовывать алгоритмы вручную. Вот типичный Kahan accumulator - 15 строк кода с переменными для ошибки.</p>
<p dir="auto">Теперь достаточно одной строки: <code>const total = Math.sumPrecise(numbers);</code>. Это ускоряет разработку и снижает баги. Поддержка уже есть в Chrome, Firefox и Node.js последних версий через флаги или полифиллы.</p>
<p dir="auto">Посмотрим реальные сценарии. В статистике: суммирование процентов отклонений. В графиках: точные значения для осей. В базах данных: агрегация float-полей без внешних библиотек.</p>
<p dir="auto">Код до:</p>
<pre><code class="language-javascript">let sum = 0, error = 0;
for (let x of numbers) {
  let y = x - error;
  let t = sum + y;
  error = (t - sum) - y;
  sum = t;
}
</code></pre>
<p dir="auto">Код после:</p>
<pre><code class="language-javascript">const sum = Math.sumPrecise(numbers);
</code></pre>
<p dir="auto">Разница огромная. Плюс метод проходит spec-тесты TC39 и работает от ES3 с полифиллом.</p>
<p dir="auto">Преимущества в практике:</p>
<ul>
<li><strong>Меньше кода</strong> - на 90% короче аналогов.</li>
<li><em>Стабильность</em> - одинаковый результат везде.</li>
<li>Интеграция с async/await и потоками данных.</li>
</ul>
<h2>Почему это меняет разработку</h2>
<p dir="auto"><strong>Math.sumPrecise</strong> закрывает давнюю дыру в JS. Раньше точные расчёты требовали BigDecimal или внешних либ вроде decimal.js. Теперь стандарт даёт решение без зависимостей.</p>
<p dir="auto">В ECMAScript 2026 это часть большего апдейта Math: добавлены методы для Float16 и другие улучшения. Для фронтенда, бэкенда и мобильных приложений - универсальный инструмент. Особенно полезно в TypeScript, где типы Number останутся, но точность вырастет.</p>
<p dir="auto">Остаётся место для размышлений: как это повлияет на библиотеки вроде D3.js или NumJS? И будет ли расширение на BigInt в будущем. В любом случае, самописные суммы уходят в прошлое.</p>
]]></description><link>https://forum.exlends.ru/topic/1295/math.sumprecise-v-ecmascript-2026-tochnye-summy-bez-samopisnyh-algoritmov</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:52:37 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1295.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Mar 2026 09:00:17 GMT</pubDate><ttl>60</ttl></channel></rss>