In vielen Programmiersprachen werden wir auf ein seltsames Phänomen stoßen: Bei der Berechnung von 0.1 + 0.2 ist das Ergebnis nicht 0.3. Zum Beispiel haben C, C++, JavaScript, Python, Java, Ruby usw. alle dieses Problem.

Aus diesem Grund hat jemand sogar einehttps://0.30000000000000004.com/Website erstellt. Auf dieser Website können wir herausfinden, welche Programmiersprachen bei der Berechnung von 0.1 + 0.2 ein Ergebnis von nicht 0.3, sondern 0.30000000000000004 liefern.




Wir können JavaScript zur Veranschaulichung verwenden. Die Berechnung von 0.1 + 0.2 ergibt ein Ergebnis von nicht 0.3, sondern 0.30000000000000004.

Natürlich, wenn Sie es als Bedingungsanweisung verwenden, gibt es ebenfalls false zurück:

Es gibt weitere Beispiele:
6 * 0.1 = 0.6 但计算机显示为 0.6000000000000001 0.11 + 0.12 = 0.23 但计算机显示为 0.22999999999999998 0.1 + 0.7 = 0.8 但计算机显示为 0.7999999999999999 0.3+0.6 = 0.9 但计算机显示为0.8999999999999999

Die folgenden Ausdrücke können jedoch das gewünschte Ergebnis liefern:

Warum ist das so?
Einfach gesagt verwenden Computer Gleitkommazahlen auf Binärbasis, während wir Menschen Gleitkommazahlen auf Dezimalbasis verwenden.
In Binärform werden Gleitkommazahlen üblicherweise nach dem IEEE-754-Standard dargestellt. Dezimalzahlen wie 0.1, 0.2 oder 0.3 können nicht exakt dargestellt werden, weil ein binäres Gleitkommaformat verwendet wird.
Zum IEEE-754-Standard siehe:https://zh.wikipedia.org/wiki/IEEE_754
Zugrundeliegendes Prinzip
Im Dezimalsystem kann ein Bruch genau dargestellt werden, wenn sein Nenner die Primfaktoren der Basis (10) verwendet.
Die Primfaktoren von 10 sind 2 und 5.
Daher können 1/2, 1/4, 1/5 (0.2), 1/8 und 1/10 (0.1) genau dargestellt werden, weil ihre Nenner die Primfaktoren von 10 verwenden.
Jedoch sind 1/3, 1/6 und 1/7 unendliche periodische Dezimalbrüche, weil ihre Nenner die Primfaktoren 3 oder 7 verwenden.
Im Binärsystem (dem von Computern verwendeten System) kann ein Bruch genau dargestellt werden, wenn er die Primfaktoren der Basis (2) verwendet.
2 ist der einzige Primfaktor von 2.
Daher können 1/2, 1/4 und 1/8 alle genau dargestellt werden, weil ihre Nenner die Primfaktoren von 2 verwenden.
Allerdings sind 1/5 (0.2) oder 1/10 (0.1) unendlich periodische Dezimalbrüche, weil ihre Nenner die Primfaktoren von 5 oder 10 verwenden.
Wenn wir also versuchen, einen Dezimalbruch wie 0.1 darzustellen, verwendet der Computer eine Näherung. Diese Näherung wird realisiert, indem der unendlich periodische Binärbruch in eine Gleitkommadarstellung mit einer endlichen Anzahl von Bits umgewandelt wird.
Wenn wir also im Computer Gleitkommaarithmetik durchführen, kann das Ergebnis einen winzigen Fehler aufweisen.
Zum Beispiel kann die Näherungsdarstellung von 0.1 im Binärsystem 0.000110011001100... sein, aber in der Gleitkommadarstellung eines Computers kann sie zu 0.00011001100110 abgeschnitten oder gerundet werden. Dies führt dazu, dass 0.1 + 0.2 in einem Computer nicht unbedingt gleich 0.3 ist, sondern geringfügig abweicht.
0.1 ist ein Zehntel (1/10). Um die Binärdarstellung von 0.1 zu erhalten (d. h. ihre Binärform), müssen wir die binäre Langdivision verwenden, das heißt, die Binärzahl 1 durch die Binärzahl 1010 dividieren (d. h. 1/1010), wie folgt:

Daher wird 0.1 im Binärsystem als 0.0001100110011001100110011... dargestellt (unendlich periodisch).
Dieses unendlich wiederkehrende Muster 0011 wird ewig weitergehen, weil das Binärsystem 0.1 im Dezimalsystem nur auf diese Weise annähern kann.
In einem tatsächlichen Computersystem wird diese unendlich periodische Dezimalzahl für Speicherung und Berechnung auf eine endliche Anzahl von Bits abgeschnitten. Dies führt zu möglichem Präzisionsverlust bei der Durchführung binärer Gleitkommaarithmetik in einem Computer, wodurch die Summe von 0.1 und 0.2 nicht genau gleich 0.3 ist.
Umwandlung von Dezimalbrüchen in Binärzahlen
Es gibt auch eine leichter verständliche Methode (die Methode „mit 2 multiplizieren und den ganzzahligen Teil nehmen“). Zum Beispiel: Um den Dezimalbruch 0.875 in eine Binärzahl umzuwandeln, multipliziert man einfach den Bruchteil mit 2 und extrahiert dann den ganzzahligen Teil, bis der Bruchteil 0 wird.

Ordnen Sie die oben extrahierten ganzzahligen Teile an, um das Ergebnis 111 zu erhalten, das dann die Binärdarstellung bildet..875。
Die Binärzahl 1101.111, mit ganzzahligem Teil 1101 und Nachkommateil 111, ist das Ergebnis der Umwandlung der Dezimalzahl 13.875 in das Binärsystem.
Mit der obigen Methode ergibt die Umwandlung des Dezimalbruchs 0.1 in das Binärsystem:
0.1 = 0.0001100110011001100110011001100110011001100110011001101...

Die Umwandlung des Dezimalbruchs 0.2 in das Binärsystem ergibt:
0.2 = 0.001100110011001100110011001100110011001100110011001101...

Lösungen
1. Wandeln Sie zuerst die Dezimalzahl in eine ganze Zahl um
Sie können die Dezimalzahlen zuerst in ganze Zahlen umwandeln, sie addieren und dann wieder in Dezimalzahlen umwandeln, wie im folgenden Beispiel:
(0.1*10 + 0.2*10)/10

2. Verwenden Sie die Methode toFixed()
Die Methode toFixed() kann eine Zahl in eine Zeichenfolgendarstellung mit einer angegebenen Anzahl von Dezimalstellen umwandeln.
Nachfolgend ein Beispiel für die Verwendung der Methode toFixed() zum Lösen von Gleitkomma-Genauigkeitsproblemen:
let sum = 0.1 + 0.2; console.log(sum.toFixed(2)); // 输出: 0.30
Es ist zu beachten, dass die Methode toFixed() das Problem zwar hinsichtlich der Anzeige löst, aber den tatsächlichen Wert der Zahl nicht ändert; sie ändert nur ihre Darstellung.
Wenn Sie präzise mathematische Operationen ausführen müssen, müssen Sie möglicherweise andere Methoden verwenden, z. B. die Einführung eines numerischen Typs mit höherer Genauigkeit oder die Verwendung einer Mathematikbibliothek eines Drittanbieters zur Handhabung von Gleitkomma-Arithmetik.
3. Verwenden Sie die Bibliothek decimal.js
Beim Umgang mit Gleitkomma-Genauigkeitsproblemen in JavaScript ist die Verwendung der Bibliothek decimal.js eine präzisere und zuverlässigere Lösung.
decimal.js ist eine Dezimalrechenbibliothek mit beliebiger Genauigkeit, die die Ungenauigkeiten von Gleitkommaoperationen in nativem JavaScript vermeiden kann.
GitHub-Adresse:https://github.com/MikeMcl/decimal.js
Zuerst müssen Sie die Bibliothek decimal.js in Ihr Projekt importieren.Installation mit npm:
npm install decimal.js
Import in HTML:
<script src="../cdnjs.cloudflare.com/ajax/libs/decimal.js/10.2.0/decimal.min.js"></script>
Als Nächstes können Sie decimal.js verwenden, um Gleitkommaoperationen zu behandeln. Hier ist ein Beispiel:
Beispiel
const Decimal = decimal. Decimal;
// Zwei Decimal-Objekte erstellen
let a = new Decimal('0.1');
let b = new Decimal('0.2');
// Addition durchführen
let sum = a.plus(b);
// Das Ergebnis ausgeben
console.log(sum.toString()); // Ausgabe: 0.3
Das unter Verwendung der decimal.js-Bibliothek erhaltene Ergebnis ist exakt 0.3, statt des Näherungswerts von nativem JavaScript.