Heim >Web-Frontend >js-Tutorial >Fehler bei der JavaScript-Gleitkommawertoperation
Problem
In JavaScript gehören sowohl Ganzzahlen als auch Gleitkommazahlen zum Datentyp „Zahl“ (einer der einfachen Datentypen). Beim Drucken einer Gleitkommazahl wie 1,0 stellen wir häufig fest, dass das Ergebnis 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 es klar im Buch stand: ECMAScrip basiert auf der numerischen Gleitkommaberechnung nach IEEE754 Wenn Sie nicht wissen, was IEEE754 ist, klicken Sie hier. Nun, diese numerische Berechnungsmethode speichert den Wert als Binärzahl und führt dann die Berechnung durch Da Rundungsfehler auftreten, sind Berechnungen mit Gleitkommazahlen weitaus ungenauer als Ganzzahlberechnungen. Denken Sie außerdem daran, niemals den Wert einer bestimmten Gleitkommazahl zu testen.
Herr Yang Jiang hat also Recht: Junge Menschen denken mehr und lernen weniger. Ohne Bildung werden sie immer am Leben zweifeln, also müssen sie immer noch mehr lernen! ! !
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. Sir, hier ist der neue Code~
//加法 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数}; //参数1小数点后的位数 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数 m=Math.pow(10,Math.max(r1,r2)); //取其中较大的位数 return (arg1*m+arg2*m)/m; //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数 }