Heim > Web-Frontend > js-Tutorial > Hauptteil

Entdecken Sie die Gründe, warum JavaScript-Gleitkommawertoperationen Rundungsfehler verursachen

巴扎黑
Freigeben: 2017-07-22 16:54:28
Original
1634 Leute haben es durchsucht

Problem

In JavaScript gehören sowohl Ganzzahlen als auch Gleitkommazahlen zum Datentyp „Zahl“ (einer der einfachen Datentypen). Wir stellen oft fest, dass das Ergebnis des Druckens einer Gleitkommazahl wie 1.0 ist ist 1 statt 1.0. Dies liegt daran, dass der Speicherplatz zum Speichern von Gleitkommazahlen doppelt so groß ist wie zum Speichern von Ganzzahlwerten, sodass ECMAScript keine Zeit beim Konvertieren von Gleitkommazahlen in Ganzzahlen verliert.
Obwohl die obige Situation Patienten mit Zwangsstörungen ein wenig unangenehm macht, ist es trotzdem kein großer Fehler. Die nächste Situation wird sehr beängstigend sein. Wenn wir beispielsweise 0.1 plus 0.2 berechnen, ist das Ausgabeergebnis nicht 0.3, sondern 0.3000000000000004. Was zum Teufel? ! Haben Sie bei Kindern, die diese Situation zum ersten Mal erleben, das Gefühl, dass Ihre Weltanschauung in Frage gestellt wurde?

Ursache

Also öffnete ich schnell das Buch, um meine Seele und meinen Körper zu retten, und stellte fest, dass im Buch klar geschrieben stand: ECMAScrip basiert auf der numerischen Gleitkommaberechnung nach IEEE754 Die Methode wandelt den numerischen Wert in einen binären Wert um und führt dann Berechnungen durch. Da Gleitkommazahlen in Binärform unendlich sind, treten bei der Durchführung arithmetischer Berechnungen Rundungsfehler auf. Berechnungen mit Gleitkommazahlen sind weitaus schlechter als Ganzzahlberechnungen und denken Sie schließlich daran, niemals den Wert einer bestimmten Gleitkommazahl zu testen .

Lösung

Die sogenannten Verschreiben Sie das richtige Medikament. Sobald Sie die Ursache des Problems kennen, können Sie die Lösung für das Problem finden. Da es sich um einen Fehler handelt, der dadurch verursacht wird, dass das Binärsystem der Gleitkommazahlen unendlich ist, tritt dieser Fehler bei Ganzzahloperationen nicht auf. Sind Sie klug genug, die Wahrheit zu erkennen? Das ist richtig, das heißt, in der arithmetischen Technik werden Gleitkommazahlen in Ganzzahlen umgewandelt und die Ergebnisse werden dann in Gleitkommazahlen umgewandelt. Gastoffizier, das Folgende ist der neue Code~

1 //加法  2 function FloatAdd(arg1,arg2){  
3        var r1,r2,m; 
4        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数};  //参数1小数点后的位数5        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数6        m=Math.pow(10,Math.max(r1,r2));  //取其中较大的位数7        return (arg1*m+arg2*m)/m;        //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数8   }
Nach dem Login kopieren

Die Original-URL ist dem obigen Nachdruck beigefügt



toFixed()-Methode sollte auch in der Lage sein, einen Teil des Rundungsfehlerproblems auf narrensichere Weise zu lösen.

Syntax: number.toFixed(x) x: Gibt die Anzahl der Dezimalstellen an, das ist ein Wert zwischen 0 und 20, einschließlich 0 und 20. Einige Implementierungen können einen größeren Zahlenbereich unterstützen. Wenn dieser Parameter weggelassen wird, wird stattdessen 0 verwendet.


ENDE


Das obige ist der detaillierte Inhalt vonEntdecken Sie die Gründe, warum JavaScript-Gleitkommawertoperationen Rundungsfehler verursachen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!