Dies ist ein altes Thema, aber immer noch hochrangige Google-Ergebnisse und die angebotenen Lösungen teilen dasselbe Problem mit Dezimalzahlen. Hier ist die (sehr generische) Funktion, die ich verwende, Dank MDN:
function round(value, exp) {
if (typeof exp === 'undefined' || +exp === 0)
return Math.round(value);
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
// Shift back
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}
Wie man sehen kann, haben wir diese Probleme nicht:
round(1.275, 2); // Gibt 1.28 zurück
round(1.27499, 2); // Gibt 1.27 zurück
Diese Generizität bietet auch einige coole Sachen:
round(1234.5678, -2); // Gibt 1200 zurück
round(1.2345678e+2, 2); // Gibt 123.46 zurück
round("123.45"); // Gibt 123 zurück
Um die Frage des OP zu beantworten, muss man Folgendes eingeben:
round(10.8034, 2).toFixed(2); // Gibt "10.80" zurück
round(10.8, 2).toFixed(2); // Gibt "10.80" zurück
Oder für eine präzisere, weniger generische Funktion:
function round2Fixed(value) {
value = +value;
if (isNaN(value))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));
// Shift back
value = value.toString().split('e');
return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}
Sie können es aufrufen mit:
round2Fixed(10.8034); // Gibt "10.80" zurück
round2Fixed(10.8); // Gibt "10.80" zurück
Verschiedene Beispiele und Tests (Dank an @t-j-crowder!):
function round(value, exp) {
if (typeof exp === 'undefined' || +exp === 0)
return Math.round(value);
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
// Shift back
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}
function naive(value, exp) {
if (!exp) {
return Math.round(value);
}
var pow = Math.pow(10, exp);
return Math.round(value * pow) / pow;
}
function test(val, places) {
subtest(val, places);
val = typeof val === "string" ? "-" + val : -val;
subtest(val, places);
}
function subtest(val, places) {
var placesOrZero = places || 0;
var naiveResult = naive(val, places);
var roundResult = round(val, places);
if (placesOrZero >= 0) {
naiveResult = naiveResult.toFixed(placesOrZero);
roundResult = roundResult.toFixed(placesOrZero);
} else {
naiveResult = naiveResult.toString();
roundResult = roundResult.toString();
}
$("")
.append($("").text(JSON.stringify(val)))
.append($("").text(placesOrZero))
.append($("").text(naiveResult))
.append($("").text(roundResult))
.appendTo("#results");
}
test(0.565, 2);
test(0.575, 2);
test(0.585, 2);
test(1.275, 2);
test(1.27499, 2);
test(1234.5678, -2);
test(1.2345678e+2, 2);
test("123.45");
test(10.8034, 2);
test(10.8, 2);
test(1.005, 2);
test(1.0005, 2);
table {
border-collapse: collapse;
}
table, td, th {
border: 1px solid #ddd;
}
td, th {
padding: 4px;
}
th {
font-weight: normal;
font-family: sans-serif;
}
td {
font-family: monospace;
}
Eingabe
Stellen
Naiv
Gründlich
1 Stimmen
Dein Code ist genau das, wonach ich gesucht habe (um die Gleitkommagenauigkeit auf 7 Dezimalstellen für kleinere JSON-Dateien zu reduzieren). Das Überspringen von Math.pow für die Geschwindigkeit val = Math.round(val * 10000000) / 10000000);
0 Stimmen
Da die aktuell akzeptierte Antwort aufgrund der sich verschlimmernden Ungenauigkeiten immanenten in den Zahlen (
0.565
,0.575
,1.005
) möglicherweise ein falsches Ergebnis für einen breiten Wertebereich liefert, würde ich vorschlagen, noch einmal einen Blick auf diese Antwort zu werfen, die sie korrekt berechnet.0 Stimmen
Vielleicht möchten Sie eine sprintf-Bibliothek für JavaScript einfügen stackoverflow.com/questions/610406/…
3 Stimmen
Nachdem Sie mit der Dezimalstellenverschiebungs- und Rundungsmethode korrekt gerundet haben, könnten Sie die
number.toFixed(x)
Methode verwenden, um sie in einen String mit der erforderlichen Anzahl von Nullen umzuwandeln. Z. B. runden Sie1.34
auf1.3
mit der Methode für alle Browser, fügen dann eine Null hinzu und wandeln sie mit1.3.toFixed(2)
in einen String um (um"1.30"
zu erhalten).0 Stimmen
Es ist 2020 und es gibt keinen einfachen nativen Weg in JavaScript, um einfach eine Zahl zu runden. wow.
0 Stimmen
Const formattedNumber = Math.round(number * 100) / 100;