Wie kann ich in JavaScript bei der Konvertierung von einer Fließkommazahl in eine Zeichenkette nur 2 Stellen nach dem Dezimalpunkt erhalten? Zum Beispiel 0,34 anstelle von 0,3445434.
Antworten
Zu viele Anzeigen?Der Schlüssel dazu ist wohl, zuerst richtig aufzurunden, dann kann man es in String umwandeln.
function roundOf(n, p) {
const n1 = n * Math.pow(10, p + 1);
const n2 = Math.floor(n1 / 10);
if (n1 >= (n2 * 10 + 5)) {
return (n2 + 1) / Math.pow(10, p);
}
return n2 / Math.pow(10, p);
}
// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34
Jetzt können Sie diesen Wert mit toFixed(p) sicher formatieren. Also mit Ihrem speziellen Fall:
roundOf(0.3445434, 2).toFixed(2); // 0.34
Es gibt ein Problem mit all diesen Lösungen, die mit Multiplikatoren arbeiten. Sowohl die Lösungen von kkyy als auch die von Christoph sind leider falsch.
Bitte testen Sie Ihren Code auf Nummer 551.175 mit 2 Dezimalstellen - es wird aufgerundet 551.17 während es sein sollte 551.18 ! Aber wenn Sie z.B. auf. 451.175 wird es in Ordnung sein - 451.18. Es ist also schwierig, diesen Fehler auf den ersten Blick zu erkennen.
Das Problem liegt in der Multiplikation: Versuchen Sie 551,175 * 100 = 55117,49999999999 (ups!)
Daher ist meine Idee, es mit toFixed() zu behandeln, bevor Math.round() verwendet wird;
function roundFix(number, precision)
{
var multi = Math.pow(10, precision);
return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}
Es gibt keine Möglichkeit, inkonsistente Rundungen für Preise mit x,xx5 als tatsächlichem Wert zu vermeiden, weder durch Multiplikation noch durch Division. Wenn Sie korrekte Preise clientseitig berechnen müssen, sollten Sie alle Beträge in Cents angeben. Dies liegt an der Art der internen Darstellung von numerischen Werten in JavaScript. Beachten Sie, dass Excel unter den gleichen Problemen leidet, so dass die meisten Leute die kleinen Fehler, die durch dieses Phänomen verursacht werden, nicht bemerken würden. Allerdings können sich Fehler häufen, wenn Sie viele berechnete Werte addieren. Es gibt eine ganze Theorie dazu, die die Reihenfolge der Berechnungen und andere Methoden zur Minimierung des Fehlers im Endergebnis beinhaltet. Um die Probleme mit Dezimalwerten zu verdeutlichen, sei darauf hingewiesen, dass 0,1 + 0,2 in JavaScript nicht genau gleich 0,3 ist, während 1 + 2 gleich 3 ist.