Spec-Zone.ru › JavaScript

Math.sumPrecise()

Базовый уровень Недавно стало доступно

Эта функция работает на последних версиях устройств и браузеров. Эта функция может не работать на старых устройствах или версиях браузеров. Она доступна во всех браузерах с апреля 2026 года.

Статический метод Math.sumPrecise() принимает итерируемый объект чисел и возвращает их сумму. Он более точен, чем суммирование чисел в цикле, поскольку он избегает потери точности чисел с плавающей запятой в промежуточных результатах.

Попробуйте

console.log(Math.sumPrecise([1, 2]));
// Expected output: 3

console.log(Math.sumPrecise([1e20, 0.1, -1e20]));
// Expected output: 0.1

Синтаксис

Math.sumPrecise(numbers)

Параметры

numbers
Итерируемый объект (например, Array) чисел.

Возвращаемое значение

Число, являющееся суммой чисел в итерируемом объекте numbers. Если итерируемый объект пуст, возвращаемое значение равно -0 (не 0).

Исключения

TypeError
Если numbers не является итерируемым объектом, или если какое-либо из чисел в итерируемом объекте не является числовым типом.

Описание

Поскольку sumPrecise() является статическим методом Math, вы всегда используете его как Math.sumPrecise(), а не как метод созданного вами объекта Math (Math не является конструктором).

Метод называется Math.sumPrecise(), потому что он более точен, чем наивное суммирование чисел в цикле. Рассмотрим следующий пример:

let sum = 0;
const numbers = [1e20, 0.1, -1e20];
for (const number of numbers) {
  sum += number;
}
console.log(sum); // 0

Результат: 0. Это связано с тем, что 1e20 + 0.1 не может быть точно представлено в 64-битных числах с плавающей запятой, поэтому промежуточный результат округляется до 1e20. Затем сумма 1e20 и -1e20 равна 0, поэтому окончательный результат равен 0.

Math.sumPrecise() избегает этой проблемы, используя специализированный алгоритм суммирования. Он работает так, как будто числа с плавающей запятой суммируются с использованием их точных математических значений, а затем окончательный результат преобразуется в ближайшее представимое 64-битное число с плавающей запятой. Это по-прежнему не может избежать проблемы с точностью 0.1 + 0.2:

console.log(Math.sumPrecise([0.1, 0.2])); // 0.30000000000000004

Поскольку литералы с плавающей запятой 0.1 и 0.2 уже представляют математические значения, превышающие 0.1 и 0.2, а их ближайшее 64-битное представление с плавающей запятой фактически является 0.30000000000000004.

Примеры

Использование Math.sumPrecise()

console.log(Math.sumPrecise([1, 2, 3])); // 6
console.log(Math.sumPrecise([1e20, 0.1, -1e20])); // 0.1

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-math.sumprecise

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
sumPrecise
147
147
137
131
26.2
147
137
98
26.2
No
147
26.2
1.2.18
2.7.8
No

См. также

  • Polyfill of Math.sumPrecise in core-js
  • es-shims polyfill of Math.sumPrecise
  • Array.prototype.reduce()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sumPrecise

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API