Angenommen, ich habe einen Wert von 15.7784514 und möchte ihn mit 15.77 ohne Rundung anzeigen.
var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));
Ergebnisse in -
15.8
15.78
15.778
15.7784514000
Wie zeige ich 15.77 an?
javascript
tempid
quelle
quelle
Antworten:
Konvertieren Sie die Zahl in eine Zeichenfolge und passen Sie die Zahl bis zur zweiten Dezimalstelle an:
Die
toFixed
Methode schlägt in einigen Fällen anders fehltoString
, seien Sie also sehr vorsichtig damit.quelle
toFixed
:(Math.floor(value * 100) / 100).toFixed(2)
. Wie Sie wahrscheinlich wissen, können seltsame Dinge mit Gleitkommawerten passieren (und auf der anderen Seite des Spektrums, wenn die Zahl zufällig ist15
, klingt es so, wie es das OP will15.00
).Number((15.7784514000*100).toString().match(/^\d+/)/100);
Update 5. November 2016
Neue Antwort, immer genau
Da Gleitkomma-Mathematik in Javascript immer Randfälle hat, ist die vorherige Lösung die meiste Zeit genau, was nicht gut genug ist. Es gibt einige Lösungen für dieses wie
num.toPrecision
, BigDecimal.js und accounting.js . Ich glaube jedoch, dass das bloße Parsen der Zeichenfolge am einfachsten und immer genauesten ist.Basierend auf dem gut geschriebenen regulären Ausdruck der akzeptierten Antwort von @Gumbo funktioniert diese neue toFixed-Funktion immer wie erwartet.
Alte Antwort, nicht immer richtig.
Rollen Sie Ihre eigene toFixed-Funktion:
quelle
toFixed(0.0000000052, 2)
ergibt '5,2'. Dies kann behoben werden, indemreturn num.toFixed(fixed+1).match(re)[0];
Sie "Ich verwende toFixed" mit einer Dezimalstelle über dem Ziel verwenden, um Rundungen zu vermeiden, und dann Ihr Regex-Match ausführenIch habe mich dafür entschieden, dies stattdessen zu schreiben, um den Rest manuell mit Zeichenfolgen zu entfernen, damit ich mich nicht mit den mathematischen Problemen befassen muss, die mit Zahlen einhergehen:
Dies gibt Ihnen "15.77" mit num = 15.7784514;
quelle
Oktober 2017
Allgemeine Lösung zum Abschneiden (keine Rundung) einer Zahl auf die n-te Dezimalstelle und zum Konvertieren in eine Zeichenfolge mit genau n Dezimalstellen für jedes n≥0.
Dabei kann x entweder eine Zahl (die in eine Zeichenfolge konvertiert wird) oder eine Zeichenfolge sein.
Hier sind einige Tests für n = 2 (einschließlich des von OP angeforderten):
* Wie in der Anmerkung erwähnt, liegt dies an der impliziten Umwandlung von Javascript in Exponential für "1.99e-7" und für einige andere Werte von n:
quelle
toFixedTrunc(0.000000199, 2) // 1.99
parseInt ist schneller als Math.floor
quelle
Mach das einfach
quelle
Dies wird 19.66 zurückgeben
quelle
Diese Lösungen funktionieren, scheinen mir aber unnötig kompliziert zu sein. Ich persönlich verwende gerne den Moduloperator, um den Rest einer Divisionsoperation zu erhalten und diesen zu entfernen. Angenommen, num = 15.7784514:
Dies entspricht der Aussage von num = num - (num% .01).
quelle
Die Antworten hier haben mir nicht geholfen, sie haben sich immer wieder aufgerundet oder mir die falsche Dezimalstelle gegeben.
Meine Lösung konvertiert Ihre Dezimalstelle in eine Zeichenfolge, extrahiert die Zeichen und gibt dann das Ganze als Zahl zurück.
quelle
Meine Version für positive Zahlen:
Schnell, hübsch, offensichtlich. (Version für positive Zahlen)
quelle
-0.7752
. Test estoFixed_norounding(-0.7752,2)
kehrt zurück-0.78
statt-0.77
Der folgende Code funktioniert sehr gut für mich:
quelle
-?
;)Ich habe das Problem auf folgende einfache Weise behoben:
Ergebnisse werden 15,77 sein
quelle
-15.7784514
Rückkehr-15.78
Schneiden Sie einfach die Ziffern ab:
quelle
Eine weitere einzeilige Lösung:
Ich habe 100 verwendet, weil Sie auf die zweite Ziffer kürzen möchten, aber eine flexiblere Lösung wäre:
Dabei steht die Anzahl der Dezimalstellen, die beibehalten werden sollen.
Weitere Informationen und Browserkompatibilität finden Sie in den Math.trunc-Spezifikationen .
quelle
Hier sind Sie ja. Eine Antwort, die einen weiteren Weg zur Lösung des Problems zeigt:
Beachten Sie die Verwendung von + vor dem endgültigen Ausdruck. Das heißt, unsere abgeschnittene, in Scheiben geschnittene Zeichenfolge wird wieder in den Zahlentyp konvertiert.
Ich hoffe es hilft!
quelle
ohne Nullen abschneiden
oder
Prüfung:
mit Nullen abschneiden
Prüfung:
quelle
Das hat bei mir gut funktioniert. Ich hoffe, es wird auch Ihre Probleme beheben.
quelle
Ein einfacher Weg, dies zu tun, ist der nächste, aber es ist notwendig sicherzustellen, dass der Betragsparameter als Zeichenfolge angegeben wird.
}}
quelle
quelle
Früher
(num-0.05).toFixed(1)
habe ich die zweite Dezimalstelle erreicht.quelle
Meine Lösung in Typoskript (kann leicht auf JS portiert werden):
Testfälle:
Irgendwelche Verbesserungen?
quelle
Rollen Sie Ihre eigene
toFixed
Funktion: Für positive WerteMath.floor
funktioniert gut.Bei negativen Werten
Math.floor
handelt es sich um eine Runde der Werte. Sie können alsoMath.ceil
stattdessen verwenden.Beispiel,
quelle
Gumbos zweite Lösung mit dem regulären Ausdruck funktioniert zwar, ist aber aufgrund des regulären Ausdrucks langsam. Die erste Lösung von Gumbo schlägt in bestimmten Situationen aufgrund der Ungenauigkeit der Gleitkommazahlen fehl. In der JSFiddle finden Sie eine Demonstration und einen Benchmark. Die zweite Lösung benötigt auf meinem aktuellen System, der Intel Core i5-2500-CPU mit 3,30 GHz, ungefähr 1636 Nanosekunden pro Anruf.
Die Lösung, die ich geschrieben habe, besteht darin, eine kleine Kompensation hinzuzufügen, um Gleitkomma-Ungenauigkeiten zu beseitigen. Es ist im Grunde genommen augenblicklich, dh in der Größenordnung von Nanosekunden. Ich habe 2 Nanosekunden pro Aufruf getaktet, aber die JavaScript-Timer sind nicht sehr präzise oder detailliert. Hier ist die JS Fiddle und der Code.
quelle
Aufbauend auf der Antwort von David D :
quelle
Es ist zuverlässiger, zwei Gleitkommawerte ohne Rundung zu erhalten.
Referenzantwort
Danke !
quelle
Es gibt bereits einige passende Antworten mit regulären Ausdrücken und arithmetischen Berechnungen. Sie können dies auch versuchen
quelle
Hier ist, was es mit String gemacht hat
quelle
All diese Antworten scheinen etwas kompliziert zu sein. Ich würde nur 0,5 von Ihrer Zahl abziehen und toFixed () verwenden.
quelle
Die effizienteste Lösung (für 2 Bruchstellen) besteht darin, vor dem Aufruf 0,005 zu subtrahieren
toFixed()
Negative Zahlen werden ebenfalls abgerundet (von Null weg). Das OP sagte nichts über negative Zahlen.
quelle
Ich weiß, dass es bereits wenige Arbeitsbeispiele gibt, aber ich denke, es lohnt sich, mein String.toFixed-Äquivalent vorzuschlagen. Einige mögen es hilfreich finden.
Das ist meine toFixed-Alternative, bei der Zahlen nicht gerundet, sondern nur abgeschnitten oder Nullen entsprechend der angegebenen Genauigkeit hinzugefügt werden. Für extra lange Zahlen wird die integrierte JS-Rundung verwendet, wenn die Genauigkeit zu lang ist. Die Funktion funktioniert für alle problematischen Nummern, die ich auf dem Stapel gefunden habe.
Beachten Sie, dass die Genauigkeit bei Zahlen mit einer Länge von 18 und mehr möglicherweise nicht richtig gehandhabt wird, z. B. wird 64-Bit-Chrome sie runden oder "e +" / "e-" hinzufügen, um die Länge der Zahl bei 18 zu halten.
Wenn Sie Operationen mit reellen Zahlen ausführen möchten, ist es sicherer, diese
Math.sqrt(10, precision)
zuerst zu multiplizieren , die Berechnungen durchzuführen und dann das Ergebnis mit dem Wert des Multiplikators zu tauchen.Beispiel:
Aus diesem Grund ist es so wichtig, einen solchen Multiplikator / Teiler zu verwenden, wenn Sie mit reellen Zahlen in Javascript arbeiten, insbesondere wenn Sie Geld berechnen ...
quelle