Ich habe diese Codezeile, die meine Zahlen auf zwei Dezimalstellen rundet. Aber ich bekomme Zahlen wie diese: 10.8, 2.4 usw. Dies sind nicht meine Vorstellung von zwei Dezimalstellen. Wie kann ich also Folgendes verbessern?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Ich möchte Zahlen wie 10.80, 2.40 usw. Die Verwendung von jQuery ist für mich in Ordnung.
0.565
,0.575
,1.005
), kann ich bei der Suche wieder vorschlagen , diese Antwort , die bekommt sie richtig?number.toFixed(x)
Methode verwenden, um sie in eine Zeichenfolge mit der erforderlichen Anzahl von Nullen zu konvertieren. ZB rund1.34
um1.3
mit der Cross-Browser - Methode fügen Sie dann 1 Null und Konvertit String mit1.3.toFixed(2)
(zu erhalten"1.30"
).Antworten:
Um eine Zahl in Festkommanotation zu formatieren, können Sie einfach die toFixed- Methode verwenden:
Beachten Sie, dass
toFixed()
eine Zeichenfolge zurückgegeben wird.WICHTIG : Beachten Sie, dass toFixed nicht 90% der Zeit rundet, sondern den gerundeten Wert zurückgibt, aber in vielen Fällen nicht funktioniert.
Zum Beispiel:
2.005.toFixed(2) === "2.00"
AKTUALISIEREN:
Heutzutage können Sie den
Intl.NumberFormat
Konstruktor verwenden. Es ist Teil der ECMAScript Internationalization API Specification (ECMA402). Es hat eine ziemlich gute Browserunterstützung , einschließlich sogar IE11, und es wird in Node.js vollständig unterstützt .Sie können alternativ die
toLocaleString
Methode verwenden, die intern dieIntl
API verwendet:Diese API bietet Ihnen auch eine Vielzahl von Formatierungsoptionen, z. B. tausend Trennzeichen, Währungssymbole usw.
quelle
(0.09).toFixed(1);
gibt in IE8 0.0 anMath.Round(0.09)
wird zurückkehren,0
so wird dies immer geben0.0
...Math.round(value*100)/100
funktioniert es besser für 2DP.Dies ist ein altes Thema, aber immer noch die besten Google-Ergebnisse, und die angebotenen Lösungen haben dasselbe Problem mit Gleitkomma-Dezimalstellen. Hier ist die (sehr generische) Funktion, die ich dank MDN verwende :
Wie wir sehen können, bekommen wir diese Probleme nicht:
Diese Großzügigkeit bietet auch einige coole Sachen:
Um die Frage des OP zu beantworten, muss man Folgendes eingeben:
Oder für eine präzisere, weniger generische Funktion:
Sie können es nennen mit:
Verschiedene Beispiele und Tests (danke an @ tj-crowder !):
Code-Snippet anzeigen
quelle
Normalerweise füge ich dies meiner persönlichen Bibliothek hinzu, und nach einigen Vorschlägen und der Verwendung der @ Timineutron-Lösung, die dann für die Dezimallänge anpassbar ist, passt diese am besten:
funktioniert für die gemeldeten Ausnahmen.
quelle
Ich weiß nicht, warum ich einer vorherigen Antwort keinen Kommentar hinzufügen kann (vielleicht bin ich hoffnungslos blind, keine Ahnung), aber ich habe eine Lösung mit der Antwort von @ Miguel gefunden:
Und seine zwei Kommentare (von @bighostkim und @Imre):
precise_round(1.275,2)
Nichtrückgabe von 1.28precise_round(6,2)
Nichtrückgabe von 6.00 (wie er wollte).Meine endgültige Lösung lautet wie folgt:
Wie Sie sehen, musste ich ein wenig "Korrektur" hinzufügen (es ist nicht das, was es ist, aber da Math.round verlustbehaftet ist - Sie können es auf jsfiddle.net überprüfen - ist dies der einzige Weg, wie ich "reparieren" konnte "es). Es addiert 0,001 zu der bereits aufgefüllten Zahl, also fügt es
1
drei0
s rechts vom Dezimalwert hinzu. Es sollte also sicher zu bedienen sein.Danach habe ich hinzugefügt,
.toFixed(decimal)
um die Zahl immer im richtigen Format auszugeben (mit der richtigen Anzahl von Dezimalstellen).Das war's auch schon. Benutze es gut;)
BEARBEITEN: Funktionalität zur "Korrektur" negativer Zahlen hinzugefügt.
quelle
precise_round(1.27499,2)
jetzt auch 1,28 zurück ... Es ist nichtMath.round
so verlustbehaftet; Computer speichern Gleitkommawerte intern. Grundsätzlich sind Sie dazu verdammt, mit einigen Werten zu scheitern, bevor die Daten überhaupt zu Ihrer Funktion gelangen :)Eine Möglichkeit, 100% sicher zu sein, dass Sie eine Zahl mit 2 Dezimalstellen erhalten:
Wenn dies zu Rundungsfehlern führt, können Sie Folgendes verwenden, wie James in seinem Kommentar erklärt hat:
quelle
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Verwenden Sie diese Methode unten
UND wenn Sie möchten, dass die Nummer fest verwendet wird
quelle
Ich habe keine genaue Lösung für dieses Problem gefunden und meine eigene erstellt:
Beispiele:
quelle
@heridev und ich haben eine kleine Funktion in jQuery erstellt.
Sie können als nächstes versuchen:
HTML
jQuery
DEMO ONLINE:
http://jsfiddle.net/c4Wqn/
quelle
input
Veranstaltung an. Dies erzeugt keinen flackernden Effekt und wird auch ausgelöst, wenn Sie mit JSDas Problem mit Gleitkommawerten besteht darin, dass sie versuchen, eine unendliche Anzahl von (kontinuierlichen) Werten mit einer festen Anzahl von Bits darzustellen. Natürlich muss es einen Verlust im Spiel geben, und Sie werden mit einigen Werten gebissen.
Wenn ein Computer 1,275 als Gleitkommawert speichert, merkt er sich nicht, ob es 1,275 oder 1,27499999999999993 oder sogar 1,27500000000000002 war. Diese Werte sollten nach dem Runden auf zwei Dezimalstellen unterschiedliche Ergebnisse liefern, werden dies jedoch nicht, da sie für Computer nach dem Speichern als Gleitkommawerte genau gleich aussehen und es keine Möglichkeit gibt, die verlorenen Daten wiederherzustellen. Bei weiteren Berechnungen wird nur eine solche Ungenauigkeit akkumuliert.
Wenn es also auf Präzision ankommt, müssen Sie Gleitkommawerte von Anfang an vermeiden. Die einfachsten Möglichkeiten sind zu
Wenn Sie beispielsweise Ganzzahlen zum Speichern der Anzahl der Hundertstel verwenden, ist die Funktion zum Ermitteln des tatsächlichen Werts recht einfach:
Bei Strings müssen Sie runden, aber es ist immer noch überschaubar:
Beachten Sie, dass diese Funktion auf den nächsten Wert rundet und von Null abweicht , während IEEE 754 empfiehlt, auf den nächsten Wert zu runden, der sogar als Standardverhalten für Gleitkommaoperationen verwendet wird. Solche Modifikationen bleiben dem Leser als Übung überlassen :)
quelle
Hier ist eine einfache
Verwenden Sie wie
alert(roundFloat(1.79209243929,4));
Jsfiddle
quelle
Runden Sie Ihren Dezimalwert und verwenden Sie ihn dann
toFixed(x)
für Ihre erwartete (n) Ziffer (n).Anruf
parseDecimalRoundAndFixed (10.800243929,4) => 10.80 parseDecimalRoundAndFixed (10.807243929,2) => 10.81
quelle
Abrunden
Zusammenfassen
Runde am nächsten
quelle
quelle
Hier ist meine 1-Zeilen-Lösung:
Number((yourNumericValueHere).toFixed(2));
Folgendes passiert:
1) Zuerst wenden Sie
.toFixed(2)
auf die Zahl an, deren Dezimalstellen abgerundet werden sollen. Beachten Sie, dass dadurch der Wert von number in eine Zeichenfolge konvertiert wird. Wenn Sie also Typescript verwenden, wird ein Fehler wie der folgende ausgegeben:"Der Typ 'Zeichenfolge' kann nicht dem Typ 'Nummer' zugewiesen werden."
2) Um den numerischen Wert zurückzugewinnen oder den String in einen numerischen Wert umzuwandeln, wenden Sie einfach die
Number()
Funktion auf diesen sogenannten 'String'-Wert an.Schauen Sie sich zur Verdeutlichung das folgende Beispiel an:
BEISPIEL: Ich habe einen Betrag mit bis zu 5 Nachkommastellen und möchte ihn auf bis zu 2 Dezimalstellen kürzen. Ich mache es so:
quelle
Stellen Sie Folgendes in einen globalen Bereich:
und dann versuchen :
Aktualisieren
Beachten Sie, dass
toFixed()
dies nur für die Anzahl der Dezimalstellen zwischen funktionieren kann,0-20
dh dassa.getDecimals(25)
möglicherweise ein Javascript-Fehler generiert wirdquelle
Dies gibt eine Zufallszahl von 1 bis 100 zurück, die auf 2 Dezimalstellen gerundet ist.
quelle
Das hat bei mir funktioniert: Dezimalstellen in JavaScript runden
quelle
Verwenden dieser Antwort als Referenz: https://stackoverflow.com/a/21029698/454827
Ich baue eine Funktion, um dynamische Dezimalzahlen zu erhalten:
hier Arbeitsbeispiel: https://jsfiddle.net/wpxLduLc/
quelle
quelle
Bei diesen Beispielen wird immer noch eine Fehlermeldung angezeigt, wenn Sie versuchen, die Zahl 1.005 zu runden. Die Lösung besteht darin, entweder eine Bibliothek wie Math.js oder diese Funktion zu verwenden:
quelle
Ich habe vor ein paar Monaten einige Ideen aus diesem Beitrag erhalten, aber keine der Antworten hier oder Antworten aus anderen Beiträgen / Blogs konnten alle Szenarien verarbeiten (z. B. negative Zahlen und einige "Glückszahlen", die unser Tester gefunden hat). Am Ende fand unser Tester unten kein Problem mit dieser Methode. Einen Ausschnitt meines Codes einfügen:
Ich habe auch Codekommentare (sorry, ich habe bereits alle Details vergessen) ... Ich poste meine Antwort hier als zukünftige Referenz:
quelle
Ich behebe das Problem mit dem Modifikator. Unterstützt nur 2 Dezimalstellen.
quelle
Das sollte ergeben:
10.20
Das sollte ergeben:
0.05
Das sollte ergeben:
4.04
usw.
quelle
quelle
Dies ist sehr einfach und funktioniert genauso gut wie alle anderen:
Da toFixed () nur für Zahlen aufgerufen werden kann und leider eine Zeichenfolge zurückgibt, führt dies die gesamte Analyse für Sie in beide Richtungen durch. Sie können eine Zeichenfolge oder eine Nummer übergeben und erhalten jedes Mal eine Nummer zurück! Wenn Sie parseNumber (1.49) aufrufen, erhalten Sie 1 und parseNumber (1.49,2) 1,50. Genau wie die Besten!
quelle
Sie können auch die
.toPrecision()
Methode und einen benutzerdefinierten Code verwenden und unabhängig von der Länge des int-Teils immer auf die n-te Dezimalstelle aufrunden.Sie können es auch zu einem Plugin für eine bessere Verwendung machen.
quelle
So einfach ist das.
quelle
Ich habe einen sehr einfachen Weg gefunden, der dieses Problem für mich gelöst hat und verwendet oder angepasst werden kann:
quelle
100% arbeiten !!! Versuch es
quelle