In JavaScript, console.log(0.1 + 0.2 === 0.3)
gibt false
zurück. Auf den ersten Blick mag dies verwirrend erscheinen, weil wir denken, dass 0.1 + 0.2
gleich 0.3
ist. Allerdings ist das in JavaScript nicht der Fall, aufgrund der Art und Weise, wie Gleitkommazahlen in der Sprache gehandhabt werden.
JavaScript verwendet die IEEE 754-Norm für Binäre Gleitkommazahlen, die in praktisch allen modernen CPUs zur nummerischen Datenrepräsentation verwendet wird. Diese Norm speichert Zahlen in einem Format, das nicht immer in der Lage ist, Dezimalzahlen exakt darzustellen.
In unserem Fall sind die Dezimalzahlen 0.1
und 0.2
nicht exakt darstellbar als ihre binären Äquivalente. Wenn sie mild, sind die gerundeten Binäräquivalente verwendet, was zu einer kleinen Rundungsabweichung führt. Wenn Sie 0.1 + 0.2
in JavaScript (oder in jeder anderen Sprache, die IEEE 754 benutzt) rechnen, ist das Ergebnis tatsächlich näher an 0.30000000000000004
als an 0.3
. Daher gibt der strikte Gleichheitsoperator ===
false
zurück.
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
Um solche Probleme zu umgehen, ist in solchen Fällen, in denen Präzision wichtig ist, generell ratsam, auf eine Bibliothek wie Decimal.js zurückzugreifen, die für hochpräzise Dezimalarithmetik konzipiert ist.
Es ist gut, sich daran zu erinnern, dass Gleitkommazahlen in fast allen Programmiersprachen nicht 100%ig genau sind, und dass in Szenarien, in denen Präzision wichtig ist (wie bei Geldberechnungen), man eine geeignete Abstraktionsbibliothek verwenden oder in Ganzzahlen rechnen sollte.