Ich versuche, Dezimalzahlen auf Dezimalstellen zu kürzen. Etwas wie das:
5.467 -> 5.46
985.943 -> 985.94
toFixed(2)
macht genau das Richtige, aber es rundet den Wert ab. Ich brauche den Wert nicht abgerundet. Hoffe das ist in Javascript möglich.
Antworten:
upd :
Es hat sich also herausgestellt, dass Rundungsfehler Sie immer verfolgen werden, egal wie sehr Sie versuchen, sie zu kompensieren. Daher sollte das Problem angegriffen werden, indem Zahlen genau in Dezimalschreibweise dargestellt werden.
Alte fehleranfällige Lösung basierend auf der Zusammenstellung anderer:
quelle
1.11.toFixedDown(1) + 22
endet wie1.122
statt23.1
. Sollte auch0.toFixedDown(1)
produzieren,0
aber stattdessen produziert es-0.1
.(-10.2131).toFixedDown(2) // ==> 10.21
.(1e-7).toFixedDown(0) // ==> 1e-7
. Heißt das für1e-(>=7)
(zB:1e-8
,1e-9
, ...).Dogberts Antwort ist gut, aber wenn Ihr Code möglicherweise mit negativen Zahlen umgehen
Math.floor
muss, kann dies zu unerwarteten Ergebnissen führen.ZB
Math.floor(4.3) = 4
aberMath.floor(-4.3) = -5
Verwenden Sie stattdessen eine Hilfsfunktion wie diese, um konsistente Ergebnisse zu erzielen:
Hier ist eine bequemere Version dieser Funktion:
Wenn dies nicht erwünscht ist, fügen Sie in
Math.abs
der ersten Zeile einen Anruf ein :BEARBEITEN : shendz weist richtig darauf hin, dass die Verwendung dieser Lösung mit
a = 17.56
falsch erzeugt17.55
. Weitere Informationen dazu finden Sie unter Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte . Leider ist es mit Javascript ziemlich schwierig, eine Lösung zu schreiben, die alle Ursachen für Gleitkommafehler beseitigt. In einer anderen Sprache würden Sie Ganzzahlen oder vielleicht einen Dezimaltyp verwenden, aber mit Javascript ...Diese Lösung sollte 100% genau sein, ist aber auch langsamer:
Für diejenigen, die Geschwindigkeit benötigen, aber auch Gleitkommafehler vermeiden möchten, versuchen Sie etwas wie BigDecimal.js . Weitere Javascript BigDecimal-Bibliotheken finden Sie in dieser SO-Frage: "Gibt es eine gute Javascript BigDecimal-Bibliothek?" und hier ist ein guter Blog-Beitrag über Mathematikbibliotheken für Javascript
quelle
if(isNAN(result) result = 0;
Abhängig vom gewünschten Verhalten.quelle
truncate(-3.14)
und-4
zurückerhalte, würde ich das definitiv als unerwünscht bezeichnen.var a = 65.1
var truncated = Math.floor(a * 100) / 100; // = 65.09
Daher ist dies keine korrekte LösungSie können die Rundung korrigieren, indem Sie 0,5 für toFixed subtrahieren, z
quelle
Betrachten wir den Vorteil der doppelten Tilde unter:
~~
.Nimm die Nummer auf. Multipliziert mit signifikanten Stellen nach dem Komma , so dass Sie gestutzt mit Null Plätzen
~~
. Teilen Sie diesen Multiplikator wieder heraus. Profitieren.Ich versuche zu widerstehen, den
~~
Anruf in Parens zu verpacken . Die Reihenfolge der Operationen sollte dafür sorgen, dass das richtig funktioniert, glaube ich.alert(truncator(5.1231231, 1)); // is 5.1
alert(truncator(-5.73, 1)); // is -5.7
alert(truncator(-5.73, 0)); // is -5
JSFiddle-Link .
EDIT: Rückblickend habe ich unbeabsichtigt auch Fälle behandelt, um auch links von der Dezimalstelle abzurunden.
alert(truncator(4343.123, -2)); // gives 4300.
Die Logik ist ein wenig verrückt nach dieser Verwendung und kann von einem schnellen Refactor profitieren. Aber es funktioniert immer noch. Besser glücklich als gut.
quelle
Math
Prototyp damit erweitern und vor der Ausführung nach NaN-s suchen, ist dies einfach perfekt.truncator((10 * 2.9) / 100, 2)
Rückgabe 0,28 statt 0,29 ... jsfiddle.net/25tgrzq1Schöne einzeilige Lösung:
Dann nenne es mit:
quelle
Ich dachte, ich würde eine Antwort mit geben,
|
da es einfach ist und gut funktioniert.quelle
or
mit 0 bedeutet "behalten Sie einfach das, was ich bereits habe". Tut was meine~~
Antwort macht, aber mit einer einzigen bitweisen Operation. Obwohl es die gleiche Einschränkung hat wie auch geschrieben: Wir können nicht über 2 ^ 31 gehen .truncate((10 * 2.9) / 100);
dieser Code 0,28 statt 0,29 zurückgibt jsfiddle.net/9pf0732dMit bitweisen Operatoren abschneiden:
quelle
@ Dogberts Antwort kann mit verbessert werden
Math.trunc
, was abschneidet anstatt zu runden.quelle
Math.trunc
, sondern eher als9.28 * 100
ist ,927.9999
statt928
. Vielleicht möchten Sie über die Gefahren des Gleitkommasquelle
Ich habe eine Antwort mit einer kürzeren Methode geschrieben. Folgendes habe ich mir ausgedacht
Die Methode kann so verwendet werden
Wenn Sie eine kürzere Syntax wünschen, können Sie loslegen
quelle
Ich denke, diese Funktion könnte eine einfache Lösung sein:
quelle
Ich habe ein Problem gefunden: unter Berücksichtigung der nächsten Situation: 2.1 oder 1.2 oder -6.4
Was ist, wenn Sie immer 3 Dezimalstellen oder zwei oder was auch immer wollen, also müssen Sie die führenden Nullen rechts vervollständigen
Dies ist die feste Funktion von Nick Knowlson
https://jsfiddle.net/huttn155/7/
quelle
x = 0.0000
TesttruncateDecimals (x, 2)
schlägt fehl. kehrt zurück0
. nicht wie erwartet0.00
quelle
Hier ist eine einfache, aber funktionierende Funktion zum Abschneiden von Zahlen mit bis zu 2 Dezimalstellen.
quelle
Der resultierende Typ bleibt eine Zahl ...
quelle
Lodash hat ein paar nützliche Methoden Math das kann rund , Boden und ceil eine Zahl zu einer bestimmten Dezimalgenauigkeit. Dies lässt nachgestellte Nullen aus.
Sie verfolgen einen interessanten Ansatz, indem sie den Exponenten einer Zahl verwenden. Anscheinend vermeidet dies Rundungsprobleme.
(Hinweis:
func
istMath.round
oderceil
oderfloor
im Code unten)Link zum Quellcode
quelle
Die Antwort von @kirilloid scheint die richtige Antwort zu sein, der Hauptcode muss jedoch aktualisiert werden. Seine Lösung kümmert sich nicht um negative Zahlen (die jemand im Kommentarbereich erwähnt hat, aber im Hauptcode nicht aktualisiert wurde).
Aktualisierung auf eine vollständig endgültig getestete Lösung:
Beispielnutzung:
Geige: JS-Nummer Abrunden
PS: Nicht genug Repo, um diese Lösung zu kommentieren.
quelle
Hier meine Sicht auf das Thema:
Es ist nur eine etwas ausgefeiltere Version von
quelle
Diejenige, die als Lösung markiert ist, ist die bessere Lösung, die ich bis heute gefunden habe, hat aber ein ernstes Problem mit 0 (zum Beispiel ergibt 0.toFixedDown (2) -0.01). Also schlage ich vor, dies zu verwenden:
quelle
Folgendes benutze ich:
quelle
arbeitet mit:
quelle
Nur um auf eine einfache Lösung hinzuweisen, die für mich funktioniert hat
konvertiere es in einen String und regex es dann neu ...
Es kann mit abgekürzt werden
quelle
Hier ist ein ES6-Code, der macht, was Sie wollen
quelle
quelle
Sie können mit Zeichenfolgen arbeiten. Es prüft, ob '.' existiert und entfernt dann einen Teil der Zeichenfolge.
abschneiden (7,88, 1) -> 7,8
abschneiden (7.889, 2) -> 7.89
abschneiden (-7,88, 1) -> -7,88
quelle