Math.sumPrecise()
Die Math.sumPrecise()
statische Methode nimmt ein Iterable von Zahlen und gibt deren Summe zurück. Sie ist präziser als das Aufsummieren in einer Schleife, da sie den Verlust von Gleitkomma-Präzision in Zwischenergebnissen vermeidet.
Probieren Sie es aus
console.log(Math.sumPrecise([1, 2]));
// Expected output: 3
console.log(Math.sumPrecise([1e20, 0.1, -1e20]));
// Expected output: 0.1
Syntax
Math.sumPrecise(numbers)
Parameter
Rückgabewert
Eine Zahl, die die Summe der Zahlen im numbers
Iterable ist. Wenn das Iterable leer ist, ist der Rückgabewert -0
(nicht 0
).
Ausnahmen
TypeError
-
Wenn
numbers
kein Iterable ist oder wenn eine der Zahlen im Iterable nicht vom Typ Zahl ist.
Beschreibung
Da sumPrecise()
eine statische Methode von Math
ist, verwenden Sie sie immer als Math.sumPrecise()
und nicht als Methode eines von Ihnen erstellten Math
-Objekts (Math
ist kein Konstruktor).
Die Methode wird Math.sumPrecise()
genannt, weil sie präziser ist als das naive Summieren von Zahlen in einer Schleife. Betrachten Sie das folgende Beispiel:
let sum = 0;
const numbers = [1e20, 0.1, -1e20];
for (const number of numbers) {
sum += number;
}
console.log(sum); // 0
Die Ausgabe ist 0. Dies liegt daran, dass 1e20 + 0.1
nicht genau in 64-Bit-Gleitkommazahlen dargestellt werden kann, sodass das Zwischenergebnis auf 1e20
gerundet wird. Dann ist die Summe von 1e20
und -1e20
0
, daher ist das Endergebnis 0
.
Math.sumPrecise()
vermeidet dieses Problem, indem es einen spezialisierten Additionsalgorithmus verwendet. Es funktioniert so, als würden die Gleitkommazahlen unter Verwendung ihrer präzisen mathematischen Werte summiert, und das Endergebnis wird dann in die nächstliegende darstellbare 64-Bit-Gleitkommazahl umgewandelt. Dies kann jedoch das 0.1 + 0.2
-Präzisionsproblem nicht vermeiden:
console.log(Math.sumPrecise([0.1, 0.2])); // 0.30000000000000004
Da die Gleitkomma-Literale 0.1
und 0.2
bereits mathematische Werte darstellen, die größer als 0.1
und 0.2
sind, und die nächstliegende 64-Bit-Gleitkommazahl ihrer Summe tatsächlich 0.30000000000000004
ist.
Beispiele
Verwendung von Math.sumPrecise()
console.log(Math.sumPrecise([1, 2, 3])); // 6
console.log(Math.sumPrecise([1e20, 0.1, -1e20])); // 0.1
Spezifikationen
Specification |
---|
Math.sumPrecise # sec-math.sumprecise |
Browser-Kompatibilität
BCD tables only load in the browser