2012-05-26 4 views
5

Ich habe Rundungsfehler bei der Verwendung von toFixed:toFixed (2) Runden "x.525" inkonsistent?

Ich verwendete toFixed(2) auf meine numerischen Berechnungen, aber die Rundung Ergebnisse sind nicht wie erwartet für einige Fälle.

Angenommen, toFixed(2) für Wert angewendet wird 17.525 dann gibt es das Ergebnis 17.52, und wenn es für 5.525 angewendet wird, dann gibt es das Ergebnis 5.53.

Im späteren Fall ist das Ergebnis der Rundung korrekt, also können Sie bitte vorschlagen, was getan werden muss, um das genaue Rundungsergebnis wie im späteren Fall zu erhalten. Oder können Sie bitte eine Alternative zu dieser Funktion vorschlagen, um korrekte Rundungsergebnisse zu erhalten?

+1

FYI, das nichts mit jQuery zu tun hat. Es ist eine JavaScript-Funktion https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed. – alexn

+2

Das Ergebnis ist vollkommen in Ordnung. Mantissen-Exponenten Gleitkommazahlen sind eine Lüge. Versuchen Sie 'toFixed (20)' und vergleichen Sie dann. –

+0

mögliche Duplikate von [Using ToFixed (2) und Mathe-Runde, um richtige Rundung zu erhalten] (http://stackoverflow.com/questions/2861055/using-tofixed2-and-math-round-to-get-correc-rounding) –

Antwort

4

Gleitpunkt Ungenauigkeit bedeutet, dass die meisten Zahlen 0,525 .52500..1 enden tatsächlich, und andere sind 0,5249999 .....

, welchen Weg der Wert Runden hängt davon ab, ob die nächste tatsächliche Darstellung in IEEE -754 Gleitkomma liegt über oder unter dem gewünschten Wert.

+2

Gibt es einen guten Weg, um dann zu Round-to-n? –

+0

'17.525.toFixed (3)' '" 17.525 "' Das Fallenlassen der letzten Ziffer ergibt "17.52" was ist falsch? Ich bekomme jedoch unterschiedliche Ergebnisse in verschiedenen Browsern, also bezweifle ich 'toFixed' ist gut: P – Esailija

+0

@Esailija nein, ich denke, 17,52 wäre in diesem Fall eine gültige Antwort. – Alnitak

1

Die Zahl in String umwandeln und damit arbeiten?

Das ist der letzte Ausweg, nachdem ich versucht habe Math.round zu verwenden, oder die nächste Rundung mit Math.ceil zu simulieren, aber es ist fehlgeschlagen. Bei der Multiplikation mit 100 ist eine Zahl (z. B. 17,525) etwas weniger als das 100-fache ihres Werts (1752,5), während andere Zahlen (z. B. 17,545) etwas mehr als das 100-fache ihres Wertes (1754,5) betragen.

+0

Ich bin nicht ganz sicher, wie die Umwandlung der Zahlen in Strings helfen würde ... scheint nur mehr Arbeit zu sein. –

+0

Wir arbeiten an der Dezimaldarstellung anstelle der Binärdarstellung der Zahl. Es ist "visuell korrekt", wenn wir den Wert vor und nach der Rundung ausdrucken. – nhahtdh

3

Statt toFixed() Verwendung Math.ceil(), Math.floor() oder Math.round()

mit einem Weg, um wie

var rnum = 5.525, 
    decimalPlaces = 2, 
    factor = Math.pow(10, decimalPlaces), 
    newnumber = Math.round(rnum * factor)/factor, 
    mydecimalvalue = parseFloat(newnumber); 

das Ergebnis ist 5.53

+0

Aber diese Return-Integer-Werte ... wie kann es hier verwendet werden? –

+0

Ja, aber dieser Link ist über 'toFixed (0)', nicht 'toFixed (2)' ... –

+0

Nachdem Sie die Zahl mit 100 multiplizieren, verliert die Zahl bereits die Genauigkeit, so dass die Verwendung dieser Methoden nicht wirklich hilft . – nhahtdh