Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 36
3.2.4Binäre Gleitkomma- und Rundungsfehler
ОглавлениеEs gibt unendlich viele reelle Zahlen, aber nur eine begrenzte Anzahl von ihnen (18.437.736.874.454.810.627, um genau zu sein) kann durch das JavaScript-Gleitkommaformat exakt dargestellt werden. Das heißt, dass die Darstellungen der Gleitkommazahlen, mit denen Sie in JavaScript arbeiten, häufig nur Näherungswerte der eigentlichen Zahlen sind.
Die von JavaScript (und so gut wie allen anderen modernen Programmiersprachen) genutzte IEEE-754-Gleitkommarepräsentation ist eine binäre Darstellung, die Brüche wie 1/2, 1/8 und 1/1024 genau abbilden kann. Unglücklicherweise sind die Brüche, die wir am häufigsten verwenden (insbesondere bei der Durchführung von finanzmathematischen Berechnungen), dezimale Brüche wie 1/10, 1/100 usw. Binäre Gleitkommarepräsentationen können deshalb so einfache Zahlen wie 0,1 nicht genau darstellen.
In JavaScript besitzen Zahlen eine hohe Genauigkeit und können sich 0,1 sehr stark nähern. Dass eine Zahl wie 0,1 aber nicht exakt dargestellt werden kann, führt bisweilen zu Problemen. Betrachten Sie zur Illustration folgenden Code:
let x = .3 - .2; // 30 Cent minus 20 Cent.
let y = .2 - .1; // 20 Cent minus 10 Cent.
x === y // => false: Die beiden Werte sind nicht gleich!
x === .1 // => false: .3 - .2 ist nicht gleich .1.
y === .1 // => true: .2 - .1 ist gleich .1.
Der Rundungsfehler ist dafür verantwortlich, dass der Unterschied zwischen den Näherungswerten für 0,3 und 0,2 nicht dem Unterschied zwischen den Näherungswerten für 0,2 und 0,1 entspricht. Sie sollten sich dessen bewusst sein, dass dies kein JavaScript-spezifisches Problem ist – es betrifft alle Programmiersprachen, die mit binären Gleitkommazahlen arbeiten. Beachten Sie bitte auch, dass die Werte von x und y im hier gezeigten Code einander und dem korrekten Wert sehr nahe kommen. Die berechneten Werte sind für die meisten Zwecke also vollkommen ausreichend – bemerkbar macht sich dieses Problem vor allem, wenn wir Werte auf Gleichheit prüfen.
Falls diese Gleitkommanäherungen für Ihre Programme problematisch sind, sollten Sie die Verwendung skalierter Ganzzahlen in Betracht ziehen. Beispielsweise könnten Sie Werte, die Geldbeträge repräsentieren, als ganze Cent statt anteilige Euro ausdrücken.