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
Спецификации
Совместимость с браузерами
| 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.sumPreciseincore-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