js genaue Berechnung

js genaue Berechnung
var numA = 0,1; 
var numB = 0,2; 
Alarm (Zahl A + Zahl B);

0,1 + 0,2 = 0,30000000000000004.
Probleme mit Rechengenauigkeitsfehlern (im Zusammenhang mit Binärzahlen).

Bei den vier Rechenoperationen mit Gleitkommazahlen treten in fast allen Programmiersprachen ähnliche Genauigkeitsfehler auf, aber in Sprachen wie C++/C#/Java wurden Methoden gekapselt, um Genauigkeitsprobleme zu vermeiden. JavaScript ist eine schwach typisierte Sprache, und vom Designkonzept her gibt es keinen strikten Datentyp für Gleitkommazahlen, sodass das Problem der Genauigkeitsfehler besonders ausgeprägt ist.

Lassen Sie uns 0,1 und 0,2 in Binärzahlen umwandeln:

0,1 => 0,0001 1001 1001 1001… (Endlosschleife)

0,2 => 0,0011 0011 0011 0011… (Endlosschleife)

Der Dezimalteil einer Gleitkommazahl mit doppelter Genauigkeit unterstützt bis zu 52 Bit. Wenn wir also die beiden addieren, erhalten wir eine Zeichenfolge von 0,0100110011001100110011001100110011001100110011001100110011001100110011001100, eine Binärzahl, die aufgrund der Dezimalgrenze der Gleitkommazahl gekürzt wurde. Wenn wir sie jetzt in eine Dezimalzahl umwandeln, wird sie zu 0,30000000000000004.

Wie kann man das Problem lösen?

Multiplizieren Sie die Zahl zunächst mit einer Zehnerpotenz und entfernen Sie die Dezimalstellen, um eine Ganzzahl zu erhalten, die in eine Binärzahl umgewandelt werden kann. Stellen Sie diese dann nach der Berechnung wieder her.

/** 
 ** Divisionsfunktion, um genaue Divisionsergebnisse zu erhalten** Hinweis: Die Divisionsergebnisse von JavaScript weisen Fehler auf, die bei der Division zweier Gleitkommazahlen deutlicher werden. Diese Funktion gibt ein genaueres Divisionsergebnis zurück.
 ** Aufruf: accdiv(arg1,arg2)
 ** Rückgabewert: das genaue Ergebnis der Division von arg1 durch arg2 **/
Funktion accdiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    versuchen {
        t1 = arg1.toString().split(".")[1].Länge;
    }
    fangen (e) {
    }
    versuchen {
        t2 = arg2.toString().split(".")[1].Länge;
    }
    fangen (e) {
    }
    mit (Mathe) {
        r1 = Zahl(arg1.toString().replace(".", ""));
        r2 = Zahl(arg2.toString().replace(".", ""));
        gibt (r1 / r2) * Math.pow(10, t2 - t1);
    }
}

/**
 ** Additionsfunktion zum Erhalten genauer Additionsergebnisse** Hinweis: JavaScript-Additionsergebnisse können Fehler enthalten, was beim Addieren zweier Gleitkommazahlen deutlicher wird. Diese Funktion gibt ein genaueres Additionsergebnis zurück.
 ** Aufruf: accAdd(arg1,arg2)
 ** Rückgabewert: das genaue Ergebnis von arg1 plus arg2 **/

Funktion accAdd(arg1, arg2) {
    var r1, r2, m, c;
    versuchen {
        r1 = arg1.toString().split(".")[1].Länge;
    }
    fangen (e) {
        r1 = 0;
    }
    versuchen {
        r2 = arg2.toString().split(".")[1].Länge;
    }
    fangen (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    wenn (c > 0) {
        var cm = Math.pow(10, c);
        wenn (r1 > r2) {
            arg1 = Zahl(arg1.toString().replace(".", ""));
            arg2 = Zahl(arg2.toString().replace(".", "")) * cm;
        } anders {
            arg1 = Zahl(arg1.toString().replace(".", "")) * cm;
            arg2 = Zahl(arg2.toString().replace(".", ""));
        }
    } anders {
        arg1 = Zahl(arg1.toString().replace(".", ""));
        arg2 = Zahl(arg2.toString().replace(".", ""));
    }
    gibt (arg1 + arg2) / m zurück;
}

/**
 ** Multiplikationsfunktion, die verwendet wird, um genaue Multiplikationsergebnisse zu erhalten** Hinweis: Die Multiplikationsergebnisse von JavaScript können Fehler enthalten, was bei der Multiplikation zweier Gleitkommazahlen deutlicher wird. Diese Funktion gibt ein genaueres Multiplikationsergebnis zurück.
 ** Aufruf: accMul(arg1,arg2)
 ** Rückgabewert: das genaue Ergebnis der Multiplikation von arg1 mit arg2 **/
Funktion accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    versuchen {
        m += s1.split(".")[1].Länge;
    }
    fangen (e) {
    }
    versuchen {
        m += s2.split(".")[1].Länge;
    }
    fangen (e) {
    }
    returniere Zahl(s1.replace(".", "")) * Zahl(s2.replace(".", "")) / Math.pow(10, m);
}

Das Obige ist der detaillierte Inhalt der präzisen JS-Berechnung. Weitere Informationen zur präzisen JS-Berechnung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • js genaue Countdown-Funktion teilen
  • Supergenaue Javascript-Methode zur Überprüfung der ID-Nummer
  • js Drag & Drop-Tabelle zur Realisierung der Inhaltsberechnung
  • js implementiert einen einfachen Rechner
  • JS-Implementierung des Apple-Rechners
  • JavaScript-Simulationsrechner
  • JavaScript zum Erreichen einer einfachen Rechnerfunktion
  • So berechnen Sie die Anzahl der Textzeilen in JavaScript
  • Einfacher JavaScript-Rechner im klassischen Fall

<<:  Dateisicherungslösung zwischen Servern: Wie sichere ich Serverdateien automatisch auf einem anderen Server?

>>:  Installationstutorial für MySQL 5.1 und 5.7 unter Linux

Artikel empfehlen

MySQL-Einschränkungen - Super detaillierte Erklärung

Inhaltsverzeichnis MySQL-Einschränkungsoperatione...

MySQL versteht kurz, wie "order by" funktioniert

Zum Sortieren ist „order by“ ein Schlüsselwort, d...

Der HTML-Seitenkopfcode ist völlig klar

Alle folgenden Codes stehen zwischen <head>....

MySQL 5.7.12 Installations- und Konfigurations-Tutorial unter Mac OS 10.11

So installieren und konfigurieren Sie MySQL auf M...

Das Prinzip und die Richtung von JavaScript

Wie lässt sich feststellen, worauf dies hinweist?...

MySQL 8.X Installations-Tutorial unter Windows

Zuvor habe ich MySQL 5.7 verwendet, aber da MySQL...

Detaillierte Erklärung, wie Vue-Komponenten Werte untereinander übertragen

Inhaltsverzeichnis Überblick 1. Die übergeordnete...

Schritte zum Kapseln der Karussellkomponente in vue3.0

Inhaltsverzeichnis 1: Kapselungsidee 2. Verpackun...

Drei Möglichkeiten zum Zeichnen einer Herzform mit CSS

Im Folgenden stellen wir drei Möglichkeiten zum Z...

JavaScript-Closures erklärt

Inhaltsverzeichnis 1. Was ist ein Abschluss? 1.2 ...

Grundlegendes Installationstutorial zum Dekomprimieren von MySQL-Paketen

Da ich auf einen neuen Computer gewechselt bin, m...