Ich habe Float-Nummern wie 3.2
und 1.6
.
Ich muss die Zahl in den ganzzahligen und den dezimalen Teil trennen. Zum Beispiel 3.2
würde ein Wert von in zwei Zahlen aufgeteilt, dh 3
und0.2
Das Erhalten des ganzzahligen Teils ist einfach:
n = Math.floor(n);
Aber ich habe Probleme, den Dezimalteil zu bekommen. Ich habe das versucht:
remainer = n % 2; //obtem a parte decimal do rating
Aber es funktioniert nicht immer richtig.
Der vorherige Code hat die folgende Ausgabe:
n = 3.1 => remainer = 1.1
Was fehlt mir hier?
n = Math.floor(n);
nur das gewünschte Ergebnis (der ganzzahlige Teil) für nicht negative Zahlen zurückgegeben wird% 1
nicht% 2
Antworten:
Verwenden Sie
1
nicht2
.quelle
Math.*
oder%
Operationen verzichten.toFixed
in einigen Situationen hilfreich sein, z . B.(2.3 % 1).toFixed(4)
=="0.3000"
.(2.3 % 1).toFixed(4).substring(2)
="3000"
wenn Sie es ohne die0.
2.3
entstanden ist und nicht2
oder3
, ist die Zahl0.2999999999999998
vollkommen akzeptabel, obwohl sie für das menschliche Auge beleidigend aussieht.Obwohl dies für Minuszahlen nicht funktioniert, müssen wir dies möglicherweise tun
quelle
Math.floor()
erneut aufrufen. Verwenden Sie einfach den von Ihnen berechneten ganzzahligen Teil.var n = 3.2, integr = Math.floor(n), decimal = n - integr;
benutze Math.floor () nur einmal.integr = 3; decimal = 0.20000000000000018;
Math.floor
mitMath.trunc
.Du könntest in einen String konvertieren, oder?
quelle
n.toString()
statt ,n + ""
weil es besser lesbar ist.n + ""
ist sie in der Tat besser (siehe jsperf.com/number-vs-number-tostring-vs-string-number ).
als Dezimaltrennzeichen verwendet, sodass Sie überall in Ordnung sind, wenn der Typ Ihrer Eingabevariablen float ist. Sie müssen sich nur mit diesem Problem befassen, wenn Ihre Eingabe eine Zeichenfolge ist. Ich muss auch beachten, dass diese Antwort eine Zeichenfolge in einem Array zurückgibt. Eine vollständigere Lösung istparseFloat('0.' + (n + '').split('.')[1])
Wie ist 0.2999999999999998 eine akzeptable Antwort? Wenn ich der Fragesteller wäre, würde ich eine Antwort von .3 wollen. Was wir hier haben, ist falsche Präzision, und meine Experimente mit Boden,% usw. zeigen, dass Javascript für diese Operationen falsche Präzision mag. Ich denke also, dass die Antworten, die die Konvertierung in einen String verwenden, auf dem richtigen Weg sind.
Ich würde das tun:
Insbesondere habe ich 100233.1 verwendet und wollte die Antwort ".1".
quelle
.toString()
berücksichtigt i18n nicht. Das Dezimaltrennzeichen entspricht immer.
dem MDN und der ECMA-SpezifikationSo mache ich das, was meiner Meinung nach der einfachste Weg ist:
quelle
Eine einfache Möglichkeit ist:
Leider gibt das nicht den genauen Wert zurück. Dies lässt sich jedoch leicht beheben:
Sie können dies verwenden, wenn Sie die Anzahl der Dezimalstellen nicht kennen:
quelle
Sprachunabhängiger Weg:
Beachten Sie, dass es nur für Zahlen mit einer Bruchlänge korrigiert.
quelle
var factor = Math.pow(10, desiredFractionLength); var fract = a * factor % factor / factor;
Sie können die
parseInt()
Funktion verwenden, um den ganzzahligen Teil abzurufen, als diese, um den dezimalen Teil zu extrahierenOder Sie könnten Regex verwenden wie:
quelle
0.20000000000000018
... das wird wirklich schwierig, weil0.2 < 0.20000000000000018
return true ist. 3.2 soll 0.2: P zurückgeben, so viele Unregelmäßigkeiten verursachen und return.toFixed(2)
string verwenden: PDas Folgende funktioniert unabhängig von den regionalen Einstellungen für das Dezimaltrennzeichen ... unter der Bedingung, dass nur ein Zeichen für ein Trennzeichen verwendet wird.
Es ist nicht schön, aber es ist genau.
quelle
Wenn Präzision wichtig ist und Sie konsistente Ergebnisse benötigen, finden Sie hier einige Vorschläge, die den Dezimalteil einer beliebigen Zahl als Zeichenfolge zurückgeben, einschließlich der führenden "0". Wenn Sie es als Schwimmer benötigen, fügen Sie es
var f = parseFloat( result )
am Ende hinzu.Wenn der Dezimalteil gleich Null ist, wird "0.0" zurückgegeben. Null-, NaN- und undefinierte Zahlen werden nicht getestet.
1. String.split
2. String.substring, String.indexOf
3. Math.floor, Number.toFixed, String.indexOf
4. Math.floor, Number.toFixed, String.split
Hier ist ein jsPerf-Link: https://jsperf.com/decpart-of-number/
Wir können sehen, dass Satz Nr. 2 der schnellste ist.
quelle
Sie können es in eine Zeichenfolge konvertieren und die
replace
Methode verwenden, um den ganzzahligen Teil durch Null zu ersetzen. Anschließend können Sie das Ergebnis wieder in eine Zahl konvertieren:quelle
/^[^,]/
). Sie sollten das Ergebnis jedoch als Zeichenfolge belassen (entfernen Sie den+
Operator), umNaN
Ergebnisse zu vermeiden .Abhängig von der Verwendung, die Sie später geben werden, könnte Ihnen diese einfache Lösung auch helfen.
Ich sage nicht, dass es eine gute Lösung ist, aber für einige konkrete Fälle funktioniert
Es wird jedoch länger dauern als die von @Brian M. Hunt vorgeschlagene Lösung
quelle
Ich hatte einen Fall, in dem ich wusste, dass alle fraglichen Zahlen nur eine Dezimalstelle haben würden, und wollte den Dezimalteil als Ganzzahl erhalten, also habe ich diesen Ansatz gewählt:
Dies funktioniert auch mit ganzen Zahlen, wobei in diesen Fällen 0 zurückgegeben wird.
quelle
Ich benutze:
Eingabe: -556.123444444
Ergebnis: 123444444
quelle
Mathematische Funktionen sind schneller, geben jedoch immer keine nativen Erwartungswerte zurück. Der einfachste Weg, den ich gefunden habe, ist
quelle
Eine gute Option ist es, die Zahl in eine Zeichenfolge umzuwandeln und dann zu teilen.
In einer Codezeile
quelle
Nachdem ich mir einige davon angesehen habe, benutze ich jetzt ...
quelle
quelle
Obwohl ich sehr spät bin, um dies zu beantworten, schauen Sie sich bitte den Code an.
quelle
Das Gleitkomma-Dezimalzeichen und das Zahlenformat können von country (
.,
) abhängig sein. Eine unabhängige Lösung, bei der der Gleitkomma-Teil erhalten bleibt, lautet also:- Es handelt sich um eine internationalisierte Lösung anstelle einer standortabhängigen:
Lösungsbeschreibung Schritt für Schritt:
parseFloat()
zur Gewährleistung der EingangskorrekturMath.abs()
zur Vermeidung von Problemen mit negativen Zahlenn = parseInt(x)
für den Dezimalteilx - n
zum Subtrahieren des DezimalteilstoFixed()
mit der Anzahl der Ziffern im schwebenden Teil der ursprünglichen Gleitkommazahl aufrufenx
. Die Anzahl wird als Differenz zwischen der Länge der ursprünglichen Nummerx
und der Nummern
in ihrer Zeichenfolgendarstellung berechnet .quelle
Verwende das hier:
Die
Math.frac
Funktion hat hier 3 Modi:Es ist einfach :)
quelle
quelle