Wie kann ich in JavaScript beim Konvertieren von einem Float in einen String nur zwei Stellen nach dem Dezimalpunkt erhalten? Zum Beispiel 0,34 anstelle von 0,3445434.
427
Wie kann ich in JavaScript beim Konvertieren von einem Float in einen String nur zwei Stellen nach dem Dezimalpunkt erhalten? Zum Beispiel 0,34 anstelle von 0,3445434.
Antworten:
Die Einzelheiten , falls der Code nicht selbsterklärend ist.
edit: ... oder einfach benutzen
toFixed
, wie von Tim Büthe vorgeschlagen . Ich habe das vergessen, danke (und eine positive Bewertung) für die Erinnerung :)quelle
toFixed()
ahmt nach, was so etwasprintf()
in C macht,toFixed()
undMath.round()
behandelt das Runden anders. In diesem Fall hattoFixed()
dies den gleichen EffektMath.floor()
(vorausgesetzt, Sie multiplizieren das Original vorher mit 10 ^ n und rufentoFixed()
mit n Ziffern auf). Die "Richtigkeit" der Antwort hängt sehr davon ab, was das OP hier will, und beide sind auf ihre Weise "richtig".Es gibt Funktionen zum Runden von Zahlen. Zum Beispiel:
druckt 5.04.
EDIT: Geige
quelle
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
wird gleich sein"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
Seien Sie vorsichtig bei der Verwendung von
toFixed()
:Zunächst wird die Zahl mit der binären Darstellung der Zahl gerundet, was zu unerwartetem Verhalten führen kann. Zum Beispiel
statt
'0.6'
.Zweitens gibt es einen IE-Fehler mit
toFixed()
. Im IE (zumindest bis Version 7, IE8 wurde nicht überprüft) gilt Folgendes:Es könnte eine gute Idee sein, dem Vorschlag von kkyy zu folgen oder eine benutzerdefinierte
toFixed()
Funktion zu verwenden, zquelle
.toFixed()
Methode zum Rückgabewert hinzuzufügen, wodurch die erforderliche Genauigkeit hinzugefügt wird, z. B.:return (Math.round(value * power) / power).toFixed(precision);
Und der Wert auch als Zeichenfolge zurückgegeben wird. Andernfalls wird eine Genauigkeit von 20 für kleinere Dezimalstellen ignorierttoFixed
: Beachten Sie, dass das Erhöhen der Genauigkeit zu unerwarteten Ergebnissen führen kann :(1.2).toFixed(16) === "1.2000000000000000"
, während(1.2).toFixed(17) === "1.19999999999999996"
(in Firefox / Chrome; in IE8 gilt letzteres aufgrund der geringeren Genauigkeit, die IE8 intern bieten kann, nicht).(0.598).toFixed(2)
nicht produziert0.6
. Es produziert0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Ein weiteres zu beachtendes Problem besteht darin, dass
toFixed()
am Ende der Zahl unnötige Nullen erzeugt werden können. Zum Beispiel:Die Idee ist, die Ausgabe mit einem zu bereinigen
RegExp
:Das
RegExp
entspricht den nachgestellten Nullen (und optional dem Dezimalpunkt), um sicherzustellen, dass es auch für Ganzzahlen gut aussieht.quelle
quelle
Es gibt ein Problem mit all diesen Lösungen, die mit Multiplikatoren herumschwirren. Die Lösungen von kkyy und Christoph sind leider falsch.
Bitte testen Sie Ihren Code für die Nummer 551.175 mit 2 Dezimalstellen - er wird auf 551.17 gerundet, während er 551.18 sein sollte ! Aber wenn Sie zum Beispiel testen. 451.175 wird es in Ordnung sein - 451.18. Daher ist es schwierig, diesen Fehler auf den ersten Blick zu erkennen.
Das Problem liegt in der Multiplikation: Versuchen Sie es mit 551.175 * 100 = 55117.49999999999 (ups!)
Meine Idee ist es also, es mit toFixed () zu behandeln, bevor ich Math.round () verwende.
quelle
toFixed
betroffen -(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
… Welche Methode auch immer verwendet wird, fügen Sie vor der Rundung besser ein Epsilon hinzu.Der Schlüssel hier ist wohl, zuerst richtig aufzurunden, dann können Sie ihn in String konvertieren.
Jetzt können Sie diesen Wert sicher mit toFixed (p) formatieren. Also mit Ihrem speziellen Fall:
quelle
Wenn Sie die Zeichenfolge ohne Runde möchten, können Sie diese RegEx verwenden (vielleicht ist dies nicht der effizienteste Weg ... aber es ist wirklich einfach).
quelle
quelle
return float_part ? int_part+'.'+float_part : int_part;
sonst , wenn Sie Integer übergeben, es zurück Zahl mit einem Punkt am Ende (zB Eingang:2100
, Ausgang:2100.
)Vielleicht möchten Sie auch ein Dezimaltrennzeichen? Hier ist eine Funktion, die ich gerade gemacht habe:
quelle
Es gibt keine Möglichkeit, eine inkonsistente Rundung von Preisen mit x.xx5 als tatsächlichem Wert durch Multiplikation oder Division zu vermeiden. Wenn Sie auf Kundenseite die richtigen Preise berechnen müssen, sollten Sie alle Beträge in Cent aufbewahren. Dies liegt an der Art der internen Darstellung numerischer Werte in JavaScript. Beachten Sie, dass Excel unter denselben Problemen leidet, sodass die meisten Benutzer die kleinen Fehler, die durch dieses Phänomen verursacht werden, nicht bemerken würden. Obwohl sich Fehler ansammeln können, wenn Sie viele berechnete Werte addieren, gibt es eine ganze Theorie, die die Reihenfolge der Berechnungen und andere Methoden zur Minimierung des Fehlers im Endergebnis beinhaltet. Um die Probleme mit Dezimalwerten hervorzuheben, beachten Sie bitte, dass 0,1 + 0,2 in JavaScript nicht genau gleich 0,3 ist, während 1 + 2 gleich 3 ist.
quelle
quelle
Ich benutze diesen Code, um Floats zu formatieren. Es basiert auf, entfernt
toPrecision()
aber unnötige Nullen. Ich würde Vorschläge zur Vereinfachung der Regex begrüßen.Anwendungsbeispiel:
quelle