498 Stimmen

Wie formatiert man einen Float in Javascript?

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.

9voto

Steven Punkte 51

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

6voto

ArteQ Punkte 79

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;
}

4voto

Wenn Sie die Zeichenkette ohne Rundung haben wollen, können Sie dieses RegEx verwenden (ist vielleicht nicht der effizienteste Weg... aber ist wirklich einfach)

(2.34567778).toString().match(/\d+\.\d{2}/)[0]
// '2.34'

2voto

ofir_aghai Punkte 2703
function trimNumber(num, len) {
  const modulu_one = 1;
  const start_numbers_float=2;
  var int_part = Math.trunc(num);
  var float_part = String(num % modulu_one);
      float_part = float_part.slice(start_numbers_float, start_numbers_float+len);
  return int_part+'.'+float_part;
}

1voto

Dony Punkte 1

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X