Vermisse ich hier etwas?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
Warum wird.toFixed()
eine Zeichenfolge zurückgegeben?
Ich möchte die Zahl auf 2 Dezimalstellen runden.
javascript
types
rounding
Derek Adair
quelle
quelle
Antworten:
Es gibt eine Zeichenfolge zurück, da 0.1 und Potenzen davon (die zum Anzeigen von Dezimalbrüchen verwendet werden) in binären Gleitkommasystemen nicht darstellbar sind (zumindest nicht mit voller Genauigkeit).
Zum Beispiel ist 0,1 wirklich 0,10000000000000000555511151231257827021181583404541015625 und 0,01 ist wirklich 0,01000000000000000020816681711721685132943093776702880859375. (Danke,
BigDecimal
dass du meinen Standpunkt bewiesen hast .:-P)Daher ist die Ausgabe als Zeichenfolge (ohne Dezimal-Gleitkomma- oder rationalen Zahlentyp) die einzige Möglichkeit, die Genauigkeit genau auf die für die Anzeige erforderliche Genauigkeit zu bringen.
quelle
toFixed
handelt sich um eine Formatierungsfunktion, die ausschließlich dazu dient, eine Zahl in eine Zeichenfolge umzuwandeln und sie mit der angegebenen Anzahl von Dezimalstellen zu formatieren. Der Grund, warum eine Zeichenfolge zurückgegeben wird, liegt darin, dass eine Zeichenfolge zurückgegeben werden soll. Wenn sietoStringFixed
stattdessen benannt würde, wäre OP über die Ergebnisse nicht überrascht. Das einzige Problem hierbei ist, dass OP erwartet hat, dass es so funktioniertMath.round
, ohne die JS-Referenz zu konsultieren.Number.prototype.toFixed
ist eine Funktion zum Formatieren einer Zahl vor dem Ausdrucken. Es ist aus der Familie dertoString
,toExponential
undtoPrecision
.Um eine Zahl zu runden, gehen Sie folgendermaßen vor:
.
Oder wenn Sie eine " native-like " -Funktion wünschen , können Sie den Prototyp erweitern:
Beachten Sie jedoch , dass die Verschmutzung des Prototyps beim Schreiben eines Moduls als schlecht angesehen wird, da Module keine Nebenwirkungen haben sollten. Also, für ein Modul verwenden , um die erste Funktion .
quelle
type Number
. Die Sache ist, dass+(anyValue)
immer eine Zahl zurückgegeben wird - z.+("45")
kehrt zurück45
,+(new Number(42))
kehrt zurück42
. Es ist ein bisschen so, als würde man die Funktion stark tippen. Wenn Sie es sich zur Gewohnheit machen, können Sie viele Fehler vermeiden :)someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
ist nicht42.01
, es ist~42.0099999999999980
. Grund: Die Nummer42.01
existiert nicht und wird auf die nächste vorhandene Nummer gerundet. Übrigens, prüfen Sie die Nummern, indem SietoPrecision(18)
sie mit allen relevanten Ziffern ausdrucken.Ich habe dieses Problem gelöst, indem ich Folgendes geändert habe:
... dazu:
Dadurch wird die Zahl jedoch in eine Zeichenfolge konvertiert und erneut analysiert, was sich erheblich auf die Leistung auswirkt. Wenn Sie Wert auf Leistung oder Typensicherheit legen, überprüfen Sie auch die anderen Antworten.
quelle
someNumber = Math.round(someNumber * 1e2) / 1e2
! Siehe meine Antwort für einen allgemeineren Weg.Warum nicht verwenden
parseFloat
?quelle
Ich habe es gelöst, indem ich es mit der JavaScript-
Number()
Funktion wieder in eine Zahl konvertiert habequelle
Natürlich gibt es einen String zurück. Wenn Sie die numerische Variable runden möchten, verwenden Sie stattdessen Math.round (). Der Punkt von toFixed besteht darin, die Zahl mit einer festen Anzahl von Dezimalstellen zu formatieren, die dem Benutzer angezeigt werden sollen .
quelle
Sie können einfach ein '+' verwenden, um das Ergebnis in eine Zahl umzuwandeln.
quelle
Was würden Sie erwarten, wenn es eine Zahl formatieren soll? Wenn Sie eine Nummer haben, können Sie so ziemlich nichts damit anfangen, weil zB
2 == 2.0 == 2.00
usw., also muss es eine Zeichenfolge sein.quelle
Um ein Beispiel dafür zu liefern, warum es sich um eine Zeichenfolge handeln muss:
Wenn Sie 1.toFixed (2) formatieren, erhalten Sie '1.00'.
Dies ist nicht dasselbe wie 1, da 1 keine 2 Dezimalstellen hat.
Ich weiß, dass JavaScript nicht gerade eine Leistungssprache ist, aber es besteht die Möglichkeit, dass Sie eine bessere Leistung für eine Rundung erzielen, wenn Sie Folgendes verwenden: roundValue = Math.round (Wert * 100) * 0,01
quelle
Weil es hauptsächlich darum geht, Zahlen anzuzeigen? Wenn Sie Zahlen runden möchten, verwenden Sie diese
Math.round()
mit geeigneten Faktoren.quelle
'42'
eine Zahl ist ... was es nicht ist. Nur weil eine Zeichenfolge nur Ziffern enthält, wird sie nicht zu einer Zahl. Dies ist kein PHP. :-PHier ist eine etwas funktionalere Version der Antwort
m93a
.quelle