2017-06-16 3 views
0

Wenn ich wie folgt vor:Javascript Parse int Rundungs ​​Ausgabe

parseInt(parseFloat(9.20)*100*1)/100 // returns 9.19 

Es gibt 9.19, wenn ich es will zurückkehren 9.20, was muss ich es bekommen ändern Sie den richtigen Wert zurück?

Ich habe das gleiche Problem, wenn ich es zu ändern:

parseInt(parseFloat(9.12)*100*1)/100 // returns 9.11 

Aber jeder andere Wert funktioniert:

parseInt(parseFloat(9.30)*100*1)/100 // returns 9.30 (correct) 

UPDATE:

: Das

Die Lösung war

(Math.round(9.20*100*1)/100).toFixed(2) 
+0

Ja, das wird nicht in fast jeder Programmiersprache (einschließlich JavaScript) funktionieren. Binärer Fließpunkt kann einfach einige Werte nicht genau darstellen. –

+0

Ihr Code macht keinen Sinn ... warum nicht 9.12/100 * 100? –

+0

[dies] (https://www.w3schools.com/js/js_numbers.asp) könnte helfen –

Antwort

0

Weil Jav aScript verwendet binäre Arithmetik, Gleitkommaarithmetik ist eine Annäherung an das Ergebnis der Basis 10.

Eine Möglichkeit, dies zu vermeiden, ist das Ausführen einer ganzzahligen Mathematik, aber Multiplizieren der Dezimalstellen um einen Faktor, der groß genug ist, um sie in ganze Zahlen zu transformieren und dann die Antwort um denselben Faktor zu unterteilen. In diesem Fall bin ich nicht sicher, warum Sie parseInt() oder parseFloat() verwenden, da Sie nicht mit Strings arbeiten.

Schließlich, wenn Sie parseInt() verwenden ist es ratsam, das zweite (optional) Argument zu verwenden und die Radix (das Basiszahlensystem verwendet werden, um die Operation auszuführen) zu liefern, wie Sie wieder falsche Werte erhalten können, wenn die Zeichenfolge geparst werden beginnt mit "0" oder "0x".

var result = parseInt(9.2*10, 10)/10 // returns 9.19 
 

 
console.log(result);

1

Das Problem ist, dass 9.20*100 in Javascript 919.9999999999999 zurückgibt und nicht 920, weil Fließkommafehler. Wenn Sie eine parseInt() auf diesem tun, wird es nicht auf den nächsten Int runden, und stattdessen schneidet es auf 919, weshalb Ihre endgültige Antwort falsch ist.

Anstatt parseInt() zu verwenden, ist eine bessere Methode zu verwenden Math.round(). Diese Methode rundet auf den nächsten Int auf 919.99999 in 920 und gibt Ihnen die richtige Antwort.

+0

Dies scheint es getan zu haben. Ich habe es geändert in '(Math.round (parseFloat (9.20) * 100 * 1)/100) .toFixed (2) // gibt" 9.20 "zurück. Danke! – fidler2326

+0

Ich möchte nur hinzufügen, dass Sie die parseFloat() in Ihrem Code überhaupt nicht benötigen, parseFloat wird verwendet, um eine Zeichenfolge wie "9.2" in das Float "9.2" zu drehen. Da Ihre Zahl bereits ein Float und keine Zeichenkette zu sein scheint, sollten Sie die 'parseFloat()' vollständig entfernen können. Ich bin auch ein bisschen neugierig, warum du scheinbar mit 1 multiplizierst? –