2016-09-29 5 views
5

Ich habe zwei negativen Wert -0.245 und -9.085. Ich möchte sie auf 2 Dezimalstellen bringen. Ich benutze JavaScript-Funktion , aber einige seltsame Ergebnisse bekommen.Runde negativer Wert auf 2 Dezimalstellen

Bitte helfen Sie mir unter die Logik hinter dem ersten Beispiel stehen abgerundet „nach unten“, aber die zweite „up“

//Examples 1. result coming as expected 
 
var num = -0.245 
 
var n = num.toFixed(2); //-0.24 
 
console.log(n); 
 

 
//Examples 2. result should be -9.08 
 
num = -9.085 
 
n = num.toFixed(2); //-9.09 
 
console.log(n);

+0

welches Ergebnis Sie bekommen? –

+0

Beispiel 1 Antwort (-0,24) ist die Antwort, die ich will, und laut Beispiel 2 sollte die Antwort -9,08 statt -9,09 sein. –

+0

[Ist die Gleitkomma-Berechnung fehlerhaft?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) könnte hier relevant sein. –

Antwort

0

Bitte überprüfen abgerundet, das hilft Ihnen alot in Die Logik dahinter verstehen:

+2

Bitte poste nicht einfach einen Link. Ich habe diese Seite bereits angeschaut und erkläre das Problem nicht. – mplungjan

+0

@mplungjan siehe http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.5, Punkt "8.a". Es gibt ein Problem beim Parsen von '0. ... Werte. – Rajesh

+0

In dieser Funktion funktioniert toFixed() - Rundung, wenn Ihr Wert vor dem Rundungswert größer oder gleich fünf ist. Zum Beispiel: In diesem Fall (0,245) .toFixed (2); es gibt 4, was weniger als ein Abrundungswert ist, so dass es nicht zu 4 bis 5 zunimmt. Aber in diesem Fall (0,255). zu Fixed (2); es zeigt 0.26. –

0

Diese Funktion rundet die Werte ab. Z.B. Wenn der Wert zwischen 9,080 und 9,084 liegt, wäre das Ergebnis 9,08 und bei einem Wert von 9,085 bis 9,089 wäre das Ergebnis 9,09.

+0

Das ist die Logik für POST-Nummern. Es wäre logisch, dass -9.085 auf -9.08 – mplungjan

+2

gerundet würde Dies erklärt auch nicht, warum die beiden Beispiele unterschiedlich gerundet sind. – Turnip

+0

@mplungjan: Ich habe nicht bekommen, dass Ihr Punkt der Abrundung für + ve und -ve Zahlen anders wäre. Bitte erläutern. –

0

enter image description here

parseFloat(Math.round(num * 100)/100).toFixed(2); 
+0

gemacht Machen Sie ein Schnipsel. Dann benutze 9.085 – mplungjan

+0

Diese Antwort beschreibt nicht wirklich, wie sie das Problem löst. Erwägen Sie, es zu bearbeiten, um einige Details zu enthalten? Es ist auch keine gute Idee, einen Screenshot des Codes zu erstellen. Schreiben Sie stattdessen den Code mit dem Abschlag von SO aus. – brandonscript

0

toFixed() gibt eine Zeichenfolgendarstellung, die nicht numObj Exponentialnotation nicht verwendet und hat genau digits Nachkommastellen Platz. Die Zahl wird bei Bedarf gerundet, und der Bruchteil wird ggf. mit Nullen aufgefüllt, damit er die angegebene Länge hat.

Das bedeutet, das Ergebnis ist nicht falsch, aber Sie erwarten , etwas anderes zu tun. Wenn Sie -9.085 auf die zweite Dezimalstelle runden, ist das mathematisch korrekte Ergebnis -9.09 (.5 die nächste Dezimalstelle aufrunden). Was Sie versuchen zu erreichen ist alles nach dem zweiten Nachkommastelle zu entfernen, die mit erreicht werden kann:

parseInt(-9.085 * 100)/100 //-9.08 

alert(parseInt(-9.085 * 100)/100)

+0

Wie ist das logisch? Rounding -9.085 UP ist -9.08 - Ihre partInt funktioniert besser als ein parseFloat. – mplungjan

+0

Im sory habe ich vergessen, dass es eine negative Zahl ist. Aber ich habe es nachgeschlagen und es gibt keine richtige Regel, wie man aber mehrere Runden macht. Es scheint, dass JavaScript beschließt, es wie eine positive Ganzzahl zu runden. In Wikipedia heißt es, negative Zahlen werden mit absoluten Werten gerundet. –

+0

Auch Ihr Code kann auf einigen Zahlen, die nicht gut ausgerichtet sind fehlschlagen – mplungjan

2

laut Beschreibung in https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed Erwähnung:

Die Zahl wird bei Bedarf gerundet und der Bruchteil ist ggf. mit Nullen aufgefüllt, so dass sie die angegebene Länge haben.

Für -0.245.toFixed (2) ist der Wert negativ ist und der Wert nach 2 Dezimalstellen ist -0,045, -0,045 höher als -0.05 ist, so ist das Ergebnis gerundet wird bis -0.24

Bei -9.085.toFixed (2) ist der Wert negativ und der Wert nach 2 Dezimalstellen ist -0,085, -0,085 ist kleiner als -0,08, daher wird das Ergebnis auf -9,09

abgerundet Für negativen Wert immer auf 2 Dezimalstellen runden.

var num = -9.085 
 
var output = num < 0 ? Math.floor(Math.abs(num) * 100) * -1/100 : num.toFixed(2) 
 
console.log(output) //-9.08

+0

Das mag funktionieren, beantwortet aber nicht die Frage von OP - _ "Bitte helfen Sie mir, die Logik hinter dem ersten Beispiel zu verstehen, das abgerundet wird" der zweite wird "auf" gerundet "_ – Turnip

+0

@Rajesh, da der Benutzer den negativen Wert immer auf 2 Dezimalstellen abrunden möchte, können wir den Wert in eine positive Zahl umwandeln und Math.floor verwenden, um den Wert auf 2 Dezimalstellen abzurunden – alpha

+0

Versuch '0.245' oder' 0.236'. Beide geben '0,24' – Rajesh