Formatieren Sie die Nummer so, dass immer 2 Dezimalstellen angezeigt werden

783

Ich möchte meine Zahlen so formatieren, dass immer 2 Dezimalstellen angezeigt werden, gegebenenfalls gerundet.

Beispiele:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

Ich habe dies verwendet:

parseFloat(num).toFixed(2);

Aber es wird angezeigt 1als1 statt 1.00.

Varada
quelle
2
Ich meine, wenn ich 1 eingebe, wird die Zahl nicht als 1,00 angezeigt, aber wenn ich 1,345 eingebe, wird 1,35 angezeigt
Varada
1
Ich habe Ihre Frage auf das umformuliert, wonach Sie gesucht haben. Bitte überprüfen Sie, ob ich Sie richtig verstanden habe.
Plackerei
präzise Rundung mit dh Unterstützung. gist.github.com/ArminVieweg/28647e735aa6efaba401
TarranJones

Antworten:

1117
(Math.round(num * 100) / 100).toFixed(2);

Live-Demo

Beachten Sie, dass es auf 2 Dezimalstellen gerundet wird , sodass die Eingabe 1.346zurückkehrt 1.35.

schuften
quelle
6
@Kooilnc: OP möchte 1als 1.00und 1.341als anzeigen 1.34.
Plackerei
49
Round () muss nicht verwendet werden, da toFixed () es rundet.
Milan Babuškov
27
toFixed () rundet es ab, aber vergessen Sie nicht, dass es einen String zurückgibt ... Diese Methode ist also wirklich nur für die Anzeige nützlich. Wenn Sie weitere mathematische Berechnungen für den gerundeten Wert durchführen möchten, verwenden Sie nicht toFixed ().
TWright
8
Laut MDN liefert Math.round aufgrund von Rundungsfehlern nicht immer genaue Ergebnisse. Ich habe dies mit 1.005 getestet, was auf 1.01 runden sollte, aber es gibt 1.00. Verwenden Sie meine Antwort für eine konsistente Genauigkeit: stackoverflow.com/a/34796988/3549440 .
Nate
13
Diese gesamte Antwort könnte auf reduziert werden (+num).toFixed(2). Es behält sogar den Rundungsfehler im Original bei, siehe Nates Antwort .
RobG
322
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35

Abel ANEIROS
quelle
1
Die letzte Zeile ist falsch. Ich habe dies in der Chrome-Konsole versucht und `` Number (1.365) .toFixed (2) gibt "1.37" zurück
Andre
1
@Andre, Chrome 29.0.1547.57 gibt mir 1.34Ausdruck Number(1.345).toFixed(2).
Drew Noakes
1
toFixed macht Rundungen, die Sie auf fast jeder Testnummer sehen können.
Andy
40
Der letzte Kommentar, der versehentlich vor dem Abschluss gesendet wurde, 1.345ist ein Beispiel für eine Zahl, die nicht genau im Gleitkomma gespeichert werden kann. Ich denke, der Grund dafür, dass sie nicht wie erwartet rundet, ist, dass sie tatsächlich leicht als Zahl gespeichert ist weniger als 1,345 und es rundet ab. Wenn Sie stattdessen mit testen (1.34500001).toFixed(2)dann sehen Sie es abrundet richtig1.35
andy
94

Diese Antwort schlägt fehl, wenn value = 1.005.

Als bessere Lösung kann das Rundungsproblem vermieden werden, indem Zahlen in Exponentialschreibweise verwendet werden:

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

Saubererer Code, wie von @Kon und dem ursprünglichen Autor vorgeschlagen:

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

Sie können toFixed()am Ende hinzufügen , um den Dezimalpunkt beizubehalten, z. B.: 1.00Beachten Sie jedoch, dass er als Zeichenfolge zurückgegeben wird.

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

Gutschrift: Runden von Dezimalstellen in JavaScript

razu
quelle
13
Erstaunlicherweise haben alle anderen hier nicht gesehen, dass toFixeddieses Rundungsproblem vorliegt. Ihre Antwort sollte die akzeptierte sein.
Armfoot
1
Ich habe gerade getestet, ob dies noch der Fall ist. Sie sind immer noch korrekt für Chrome Version 59.0.3071.115. Ihre Lösung wird für 1.005 (1.01) aufgerundet und für 1.00499999 (1.00)
abgerundet
jsfiddle.net/Artistan/qq895bnp/28 Es gibt "Zeiten", in denen toFixed funktioniert, aber es ist ziemlich inkonsistent. :)
Artistan
Surround-Nummer in parseFloat ist die zurückkehrende Zeichenfolge
user889030
1
Dies ist eine solide Antwort. Ein paar Verbesserungen, die ich mir vorstellen kann: (1) VS-Code (TypeScript-Datei) mag es nicht, wenn Math.round () eine Zeichenfolge übergibt. (2) Machen Sie die Anzahl der Dezimalstellen dynamisch (nicht fest auf 2 codiert). (3) toFixed () erscheint unnötig. Also, was ich mir Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
Kon
23
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120
Tiberiu Petcu
quelle
Das führt zu unerwarteten Ergebnissen. Wenn Ihre Zahl 1,4, 23,654 und 0 sein kann, welche Genauigkeit würden Sie wählen?
Shinzou
2
Beachten Sie, dass das OP nach "Rundung, wo zutreffend" fragt . toPrecisionformatiert die Zahl nur auf eine bestimmte Anzahl von Dezimalstellen, wobei redundante Stellen einfach weggelassen, aber nicht gerundet werden . Dies könnte natürlich auch sehr nützlich sein, aber es ist wichtig, den Unterschied zu verstehen.
Boaz - Stellen Sie Monica
1
Tatsächlich ist toPrecision laut Mozilla rund. Test:(20.55).toPrecision(3) "20.6"
James L.
2
Wenn Sie wollen Nullen Streifen Hinter , warf es in eine Zahl oder Float nach der Verwendung toFixed: const formattedVal = Number(val.toFixed(2));Verwenden Sie keine toPrecision, da es die nicht-Dezimalzahlen zählt , wenn die Genauigkeit param verwenden.
James L.
17

Erstellen Sie für die genaueste Rundung diese Funktion:

function round(value, decimals) {
    return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}

und verwenden Sie es, um auf 2 Dezimalstellen zu runden:

console.log("seeked to " + round(1.005, 2));
> 1.01

Dank Razu , diesem Artikel und der Math.round-Referenz von MDN .

Nate
quelle
1
Was ist mit 1.0049999999999998934?
4esn0k
1
Es geht nicht über 2 dp hinaus
Stephen Adelakun
1
jsfiddle.net/Artistan/qq895bnp getestet, dies ist die einzige konsistente Methode, die ich gesehen habe. Vielen Dank.
Artistan
16

Verwenden Sie für moderne Browser toLocaleString:

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

Geben Sie ein Gebietsschema-Tag als ersten Parameter an, um das Dezimaltrennzeichen zu steuern . Verwenden Sie für einen Punkt beispielsweise das englische US-Gebietsschema:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

was gibt:

1,35

Die meisten Länder in Europa verwenden ein Komma als Dezimaltrennzeichen. Wenn Sie also beispielsweise das Gebietsschema Schwedisch / Schweden verwenden:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

es wird geben:

1,35

holmis83
quelle
Ich bin mir nicht sicher, warum dies abgelehnt wird, es schien für mich gut zu funktionieren. Bitte fügen Sie einen Kommentar hinzu, wenn Sie abstimmen möchten, wenn etwas damit nicht stimmt!
John Culviner
13

Einfachste Antwort:

var num = 1.2353453;
num.toFixed(2); // 1.24

Beispiel: http://jsfiddle.net/E2XU7/

macio.Jun
quelle
11
Nun, toFixedwurde bereits in stackoverflow.com/a/13292833/218196 vorgeschlagen . Welche zusätzlichen Informationen enthält Ihre Frage?
Felix Kling
Diese Antwort enthält keine runde Funktionalität, meine Antwort enthält tho.
Macio.Juni
8
Äh? Es ist genau die gleiche Antwort. toFixedEine Nummer anrufen .
Felix Kling
1
Richtige, gleiche Funktion, aber das Ergebnis dieser Antwort ist irreführend. Ich habe sie nur korrigiert, indem ich die runde Funktionalität ausgedrückt habe.
Macio.Jun
Die Frage lautet: "... gegebenenfalls Rundung". Ihre Antwort beinhaltet keine Rundung.
Chris
12

Eine viel allgemeinere Lösung zum Runden auf N Stellen

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346
PirateApp
quelle
1
Diese Antwort schlägt mit bestimmten Zahlen nahe 0 fehl und roundN(-3.4028230607370965e+38,2)kehrt "-3.4028230607370965e+38"anstelle der erwarteten 0,00 zurück
Ferrybig
interessant @Ferrybig Ich werde die Zahlen testen, die Sie erwähnt haben, und über eine
Problemumgehung
1
Beachten Sie, dass die zuvor erwähnte Zahl nicht Null anzeigen sollte, sondern eine große Zahl. Dies war nur ein Fehler in meinem Gehirn. Aber es funktioniert immer noch nicht, da es immer noch keine 2 Dezimalstellen
anzeigt
9

Wenn Sie jQuery bereits verwenden, können Sie das jQuery-Nummernformat verwenden Plugin .

Das Plugin kann formatierte Zahlen als Zeichenfolge zurückgeben, Sie können Dezimalstellen und Tausende von Trennzeichen festlegen und die Anzahl der anzuzeigenden Dezimalstellen auswählen.

$.number( 123, 2 ); // Returns '123.00'

Sie können das jQuery Number Format auch von GitHub herunterladen .

Sam Sehnert
quelle
11
Es ist übertrieben, ein Plugin zu verwenden, "nur um einen Dezimalteil fester Länge zu haben".
Lashae
9
@ Lashae, klar, wenn das alles ist, was du tun willst. Ich habe dies gepostet, falls das OP oder jemand anderes die zusätzlichen Funktionen des Plugins haben möchte.
Sam Sehnert
wenn das Poster der Frage natürlich das jQuery-Tag hinzugefügt hätte;)
fullstacklife
7

Ist es das was du meinst?

function showAsFloat(num, n){
      return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}

document.querySelector('#result').textContent = 
    [
     'command                      | result',
     '-----------------------------------------------',
     'showAsFloat(1);              | ' + showAsFloat(1),
     'showAsFloat(1.314);          | ' + showAsFloat(1.314),
     'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
     'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
     'showAsFloat(2456198, 5)      | ' + showAsFloat('2456198', 5),
     'showAsFloat(0);              | ' + showAsFloat(0)
    ].join('\n');
<pre id="result"></pre>

KooiInc
quelle
6

Konvertieren Sie eine Zahl in eine Zeichenfolge, wobei Sie nur zwei Dezimalstellen beibehalten:

var num = 5.56789;
var n = num.toFixed(2);

Das Ergebnis von n ist:

5.57
Behnam Mohammadi
quelle
4

Suchen Sie Boden?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00
samwise
quelle
4
Ich glaube nicht, dass er auf die nächste ganze Zahl abrunden möchte.
Plackerei
Ja, ich war mir aus der Beschreibung nicht sicher, aber ich habe es nur rausgeworfen, falls
samwise
3
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00
Ar Nr
quelle
3

Hier ist auch eine generische Funktion, die auf eine beliebige Anzahl von Dezimalstellen formatiert werden kann:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}
Minas Mina
quelle
3

Wenn eine bestimmte Formatierung erforderlich ist, sollten Sie Ihre eigene Routine schreiben oder eine Bibliotheksfunktion verwenden, die genau das tut, was Sie benötigen. Die grundlegende ECMAScript-Funktionalität reicht normalerweise nicht aus, um formatierte Zahlen anzuzeigen.

Eine ausführliche Erklärung zum Runden und Formatieren finden Sie hier: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

Rundungen und Formatierungen sollten in der Regel nur als letzter Schritt vor der Ausgabe durchgeführt werden. Wenn Sie dies früher tun, kann dies zu unerwartet großen Fehlern führen und die Formatierung zerstören.

RobG
quelle
Es gibt Zeiten, in denen ich nach eigener Wahl den Kopf schüttle, um mich in letzter Zeit so intensiv auf diese gesamte JS / Ecma-Plattform einzulassen. :( "Wenn eine bestimmte Formatierung erforderlich ist, sollten Sie Ihre eigene Routine schreiben oder eine Bibliotheksfunktion verwenden, die genau das tut, was Sie benötigen. Die grundlegende ECMAScript-Funktionalität reicht normalerweise nicht aus, um formatierte Zahlen anzuzeigen." Was für eine blöde Aussage - nicht, dass Sie sie gemacht haben. aber weil diese Tatsache existiert. Nur traurig. Steig auf den Ball, Javascript! :)
ChrisH
2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>

Leonardo Filipe
quelle
2

Laufen Sie einfach in diesen längsten Thread, unten ist meine Lösung:

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

Lassen Sie mich wissen, ob jemand ein Loch stechen kann

Sam Johnson
quelle
2

Ehtesham Ahmad Nadim
quelle
2
Dieser Code reicht aus, um Ihre Anforderungen zu erfüllen parseFloat(num.toFixed(2))
kva
1

Sie geben uns nicht das ganze Bild.

javascript:alert(parseFloat(1).toFixed(2))zeigt 1,00 in meinen Browsern an, wenn ich es in die Positionsleiste einfüge. Wenn Sie jedoch danach etwas tun, wird es zurückgesetzt.

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00
mplungjan
quelle
Funktioniert in FF 50, Chrome 49 und IE 8
Florian Straub
1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);
Darshak Shekhda
quelle
1

Ich musste mich zwischen den Konvertierungen parseFloat () und Number () entscheiden, bevor ich toFixed () aufrufen konnte. Hier ist ein Beispiel für eine Zahlenformatierung nach der Erfassung von Benutzereingaben.

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

Ereignishandler:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

Der obige Code führt zu einer TypeError-Ausnahme. Beachten Sie, dass der HTML-Eingabetyp zwar "number" ist, die Benutzereingabe jedoch tatsächlich ein "string" -Datentyp ist. Die Funktion toFixed () kann jedoch nur für ein Objekt aufgerufen werden, das eine Zahl ist.

Mein endgültiger Code würde wie folgt aussehen:

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

Der Grund, warum ich mit Number () vs. parseFloat () umsetze, ist, dass ich weder für eine leere Eingabezeichenfolge noch für einen NaN-Wert eine zusätzliche Validierung durchführen muss. Die Number () -Funktion behandelt automatisch eine leere Zeichenfolge und verdeckt sie auf Null.

vitek
quelle
0

Ich mag:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

Runden Sie die Zahl mit 2 Dezimalstellen und stellen Sie sicher, dass Sie sie analysieren parseFloat() , um Number und nicht String zurückzugeben, es sei denn, es ist Ihnen egal, ob es sich um String oder Number handelt.

Yuichi
quelle
Ich denke, wenn der Zweck darin bestand, mit einer Genauigkeit von 2 Dezimalstellen anzuzeigen, wird das Parsen des Floats das durcheinander bringen. ZBparseFloat("1.00") // 1
Stijn de Witt
0

Extend Math Objekt mit Präzisionsverfahren

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)

Bortunac
quelle
0

parseInt(number * 100) / 100; arbeitete für mich.

Sei Wake Pandey
quelle
0

Hier ist eine andere Lösung, um nur mit Floor zu runden, dh sicherzustellen, dass der berechnete Betrag nicht größer als der ursprüngliche Betrag ist (manchmal für Transaktionen erforderlich):

Math.floor(num* 100 )/100;
Naty
quelle
0

Sie können diesen Code ausprobieren:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.56
VnDevil
quelle
0

Versuchen Sie den folgenden Code:

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
Tsuna Sawada
quelle
-3
(num + "").replace(/^([0-9]*)(\.[0-9]{1,2})?.*$/,"$1$2")
Krähensuppe
quelle
-3

So löse ich mein Problem:

parseFloat(parseFloat(floatString).toFixed(2));
Alex T.
quelle