Die verständlichste Erklärung des GenauigkeitsproblemsBeispielsweise ist die Zahl 1÷3=0,33333333... Jeder weiß, dass sich 3 unendlich oft wiederholt, und die Mathematik kann das ausdrücken, aber der Computer muss sie speichern, damit sie beim nächsten Mal abgerufen und verwendet werden kann. Aber 0,333333... diese Zahl wiederholt sich unendlich, wie lässt man den Computer sie speichern? Egal, wie groß der Speicher des Computers ist, er kann nicht alles speichern, richtig! Er kann also keinen Wert relativ zur Mathematik speichern, sondern nur einen ungefähren Wert. Wenn der Computer ihn also speichert und dann zur Verwendung herausnimmt, treten Genauigkeitsprobleme auf. JS übertrifft die Präzision der Zahlenlösung1. Die maximale sichere Zahl in js ist Math.pow(2,53) - 1. Wenn die Zahl diesen Wert überschreitet, geht die Genauigkeit verloren. Sie können das Problem lösen, indem Sie die Zahl wie folgt in eine Zeichenfolge umwandeln: // js maximale sichere Zahl: Math.pow(2, 53)-1 sei a = '123456444565456.889' sei b = '121231456.32' // a + b = '123456565796913.209' Funktion addTwo(a, b) { //1. Vergleiche die Längen zweier Zahlen und füge der kürzeren Zahl eine 0 voran if (a.Länge > b.Länge) { lass arr = Array(a.Länge - b.Länge).fill(0); b = arr.join('') + b } sonst wenn (a.Länge < b.Länge) { lass arr = Array(b.Länge - a.Länge).fill(0); a = arr.join('') + a } //2. Kehren Sie die beiden Zahlen um (das liegt daran, dass die Leute daran gewöhnt sind, von links nach rechts zu addieren, Zahlen jedoch von rechts nach links addiert werden, sodass die Umkehrung leichter zu verstehen ist) a = a.split('').reverse(); b = b.split('').reverse(); //3. Durchlaufe zwei Arrays und addiere sie. Wenn die Summe größer als 10 ist, dann ist das Vorzeichen = 1 und der Wert an der aktuellen Position ist (Summe % 10). let sign = 0; //markiere, ob ein Übertrag vorhanden ist let newVal = []; //wird verwendet, um das Endergebnis zu speichern for (let j = 0; j < a.length; j++) { let val = a[j] / 1 + b[j] / 1 + sign; // Durch 1 teilen, um sicherzustellen, dass alles Zahlen sind. Sie können hier auch Number() verwenden. wenn (Wert >= 10) { Zeichen = 1; newVal.unshift(val % 10) // unshift wird hier anstelle von push verwendet, da es die Verwendung von reverse erspart } anders { Vorzeichen = 0; newVal.unshift(Wert) } } // Die letzte Addition muss eine Ziffer '1' enthalten returniere Vorzeichen && newVal.unshift(Vorzeichen) && newVal.join('') || newVal.join('') } // Siehe die prägnante Schreibweise anderer Freunde function addTwo(a,b) { lass temp = 0 lass res = '' a = a.split('') b = b.split('') während(a.Länge || b.Länge || temp) { temp += Zahl(a.pop() || 0) + Zahl(b.pop() || 0) res = (temp%10) + res temp = temp > 9 } returniere res.replace(/^0+/g, '') } 2. Wenn es um das Hinzufügen von Dezimalteilen geht, kapseln Sie die obige Methode einmal und die vollständige Implementierung lautet wie folgt: sei a = '123456444565456.889' sei b = '121231456.32' // a + b = '123456565796913.209' Funktion addTwo(a = '0',b = '0', isHasDecimal=false) { //1. Vergleiche die Längen zweier Zahlen und füge der kürzeren Zahl eine 0 voran if (a.Länge > b.Länge) { lass arr = Array(a.Länge - b.Länge).fill(0); b = isHasDecimal && (b + arr.join('')) || arr.join('') + b } sonst wenn (a.Länge < b.Länge) { lass arr = Array(b.Länge - a.Länge).fill(0); a = isHasDecimal && (a + arr.join('')) || arr.join('') + a } //2. Kehren Sie die beiden Zahlen um (das liegt daran, dass die Leute daran gewöhnt sind, von links nach rechts zu addieren, Zahlen jedoch von rechts nach links addiert werden, sodass die Umkehrung leichter zu verstehen ist) a = a.split('').reverse(); b = b.split('').reverse(); //3. Durchlaufe zwei Arrays und addiere sie. Wenn die Summe größer als 10 ist, dann ist das Vorzeichen = 1 und der Wert an der aktuellen Position ist (Summe % 10). let sign = 0; //markiere, ob ein Übertrag vorhanden ist let newVal = []; //wird verwendet, um das Endergebnis zu speichern for (let j = 0; j < a.length; j++) { let val = a[j] / 1 + b[j] / 1 + sign; // Durch 1 teilen, um sicherzustellen, dass alles Zahlen sind. Sie können hier auch Number() verwenden. wenn (Wert >= 10) { Zeichen = 1; newVal.unshift(val % 10) // unshift wird hier anstelle von push verwendet, da es die Verwendung von reverse erspart } anders { Vorzeichen = 0; newVal.unshift(Wert) } } // Die letzte Addition muss eine Ziffer '1' enthalten returniere Vorzeichen && newVal.unshift(Vorzeichen) && newVal.join('') || newVal.join('') } Funktion add(a,b) { lass num1 = String(a).split('.') lass num2 = String(b).split('.') let intSum = addTwo(num1[0], num2[0]) lass res = intSum wenn (Anzahl1.Länge>1 || Anzahl2.Länge > 1) { let decimalSum = addTwo(num1[1], num2[1], true) wenn (Dezimalsumme.Länge > (Zahl1[1]||'0').Länge && Dezimalsumme.Länge > (Zahl2[1]||'0').Länge) { intSum = addTwo(intSum, decimalSum[0]) decimalSum = decimalSum.slice(1) res = `${intSum}.${decimalSum}` } anders { res = `${intSum}.${decimalSum}` } } Rückgabewert } console.log(add(a, b)) // 123456565796913.209 // konsole.log(add('325', '988')) // 1313 Sehen Sie sich einige typische Probleme mit dem Verlust digitaler Präzision bei JS an
ZusammenfassenDies ist das Ende dieses Artikels zur Lösung des Problems ungenauer Zahlen in JS. Weitere relevante Inhalte zu ungenauen Zahlen in JS finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Installieren von MySQL 8.0.12 basierend auf Windows
>>: Erfahren Sie, wie Sie ein Vue-Projekt mit Docker bereitstellen
Dieser Artikel erläutert anhand von Beispielen da...
Inhaltsverzeichnis 1. Kapselungs-API 2. Globale T...
Inhaltsverzeichnis Vorwort Einführung in Closures...
Der schnellste Weg, die neueste Version von OpenS...
In diesem Artikel wird der spezifische JavaScript...
Inhaltsverzeichnis URL-Modul 1.Parse-Methode 2. F...
Es gibt viele Datenbankverwaltungstools für MySQL...
Gängige Konventions-Tags Selbstschließende Tags, ...
Einführung in Rahmeneigenschaften border -Eigensc...
In den meisten Fällen unterstützt MySQL Chinesisc...
Inhaltsverzeichnis Hauptsächlich verwendete Postm...
Inhaltsverzeichnis Vorwort 1. for-Schleife 2. whi...
In diesem Artikel wird die Installations- und Kon...
0. Hintergrund Hardware: Xiaomi Notebook Air 13/I...
Verwenden Sie Canvas, um Grafiken und Text mit Sc...