JavaScript konvertiert eine große INT in eine wissenschaftliche Notation, wenn die Anzahl groß wird. Wie kann ich dies verhindern?
javascript
chris
quelle
quelle
translate
Transformation auftritt, die Koordinaten in wissenschaftlicher Notation enthält.Antworten:
Es gibt Number.toFixed , aber es verwendet die wissenschaftliche Notation, wenn die Zahl> = 1e21 ist und eine maximale Genauigkeit von 20 hat. Ansonsten können Sie Ihre eigene würfeln, aber es wird chaotisch.
Oben wird eine billige und einfache Zeichenfolgenwiederholung verwendet (
(new Array(n+1)).join(str)
). Sie können dieString.prototype.repeat
Verwendung der russischen Bauernmultiplikation definieren und diese stattdessen verwenden.Diese Antwort sollte nur auf den Kontext der Frage angewendet werden: Anzeigen einer großen Anzahl ohne Verwendung der wissenschaftlichen Notation. Für alles andere sollten Sie eine BigInt- Bibliothek wie BigNumber , Leemons BigInt oder BigInteger verwenden . In Zukunft sollte das neue native BigInt (Hinweis: nicht Leemon's) verfügbar sein. Chromium und darauf basierende Browser ( Chrome , der neue Edge [v79 +], Brave ) und Firefox werden unterstützt. Die Unterstützung von Safari ist im Gange.
So würden Sie BigInt dafür verwenden:
BigInt(n).toString()
Beispiel:
Code-Snippet anzeigen
Hüten Sie sich vor , Sie jedoch, dass eine ganze Zahl Sie Ausgabe als JavaScript - Nummer (kein BigInt) , die mehr als 15 bis 16 Ziffern ist (genauer gesagt, größer ist als
Number.MAX_SAFE_INTEGER + 1
[9.007.199.254.740.992]) gerundet sein kann, weil JavaScript Nummer Typ (IEEE-754 mit doppelter Genauigkeit Gleitkomma) kann nicht alle ganzen Zahlen über diesen Punkt hinaus genau halten. DaNumber.MAX_SAFE_INTEGER + 1
es in Vielfachen von 2 arbeitet, kann es keine ungeraden Zahlen mehr halten (und ähnlich beginnt es bei 18.014.398.509.481.984 in Vielfachen von 4, dann 8, dann 16, ... zu arbeiten).Wenn Sie sich auf
BigInt
Unterstützung verlassen können, geben Sie Ihre Nummer als Zeichenfolge aus, die Sie an dieBigInt
Funktion übergeben:Beispiel:
Code-Snippet anzeigen
quelle
Math.abs
. Danke für die Warnung.toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
sollte dann wahr zurückgeben, aber es tut nicht ...Ich weiß, dass dies eine ältere Frage ist, zeigt aber vor kurzem aktiv. MDN toLocaleString
Sie können Optionen verwenden, um die Ausgabe zu formatieren.
Hinweis:
Number.toLocaleString () rundet nach 16 Dezimalstellen, so dass ...
...kehrt zurück...
586084736227728400000000000000000000000
Dies ist möglicherweise unerwünscht, wenn die Genauigkeit für das beabsichtigte Ergebnis wichtig ist.
quelle
js console.log( myNumb.toLocaleString('fullwide', { useGrouping: true, maximumSignificantDigits:6}) );
Für kleine Zahlen und wenn Sie wissen, wie viele Dezimalstellen Sie möchten, können Sie toFixed verwenden und dann einen regulären Ausdruck verwenden, um die nachfolgenden Nullen zu entfernen.
quelle
(1000).toFixed(0).replace(/\.?0+$/,"") // 1, not 1000
eine weitere mögliche Lösung:
quelle
Number.MAX_SAFE_INTEGER
wahrscheinlich, leidet unter diesem Problem.Hier ist meine kurze Variante der
Number.prototype.toFixed
Methode, die mit einer beliebigen Zahl funktioniert:quelle
Number
. Wenn Sie den ersten in a umwandelnNumber
, werden Sie feststellen, dass sie absolut gleich sind: jsfiddle.net/qd6hpnyx/1 . Sie können Ihre Gegenstimme zurücknehmen:P
.0
durch leere Zeichenfolgen zu ersetzen .console.log(2.2e307.toFixedSpecial(10))
. Ich meine ... ich bekomme mehrere nachgestellte Nullen. Upvoting sowieso, weil dies dem am nächsten kommt, was ich brauche.Die folgende Lösung umgeht die automatische exponentielle Formatierung für sehr große und sehr kleine Zahlen. Dies ist die Lösung von outis mit einem Bugfix: Es funktionierte nicht für sehr kleine negative Zahlen.
quelle
Die Antworten anderer geben Ihnen nicht die genaue Zahl!
Diese Funktion berechnet die gewünschte Zahl genau und gibt sie in der Zeichenfolge zurück, um zu verhindern, dass sie durch Javascript geändert wird!
Wenn Sie ein numerisches Ergebnis benötigen, multiplizieren Sie einfach das Ergebnis der Funktion mit Nummer eins!
quelle
Verwendung
.toPrecision
,.toFixed
usw. Sie können die Anzahl der Stellen in der Zahl zählen , indem es in einen String mit der Umwandlung.toString
dann zugleich in ihrem.length
.quelle
(2e64).toString()
wird zurückkehren"2e+64"
,.length
ist also nutzlos.Dies ist, was ich letztendlich verwendet habe, um den Wert von einer Eingabe zu übernehmen, Zahlen mit weniger als 17 Ziffern zu erweitern und Exponentialzahlen in x10 y umzuwandeln
quelle
Sie können die Zahl durchlaufen und die Rundung erreichen
quelle
Ich habe versucht, mit der Zeichenfolgeform und nicht mit der Zahl zu arbeiten, und dies schien zu funktionieren. Ich habe dies nur auf Chrome getestet, aber es sollte universell sein:
quelle
Ich denke, es gibt vielleicht mehrere ähnliche Antworten, aber hier ist eine Sache, die ich mir ausgedacht habe
Hinweis: Dies ist nur so genau wie die JavaScript-Mathematikfunktionen und hat Probleme bei der Verwendung von log anstelle von log10 in der Zeile vor der for-Schleife. Es wird 1000 in Base-10 als 000 schreiben, also habe ich es in log10 geändert, weil die Leute sowieso sowieso meistens Base-10 verwenden.
Dies ist möglicherweise keine sehr genaue Lösung, aber ich bin stolz darauf, dass sie Zahlen erfolgreich über Basen hinweg übersetzen kann und eine Option für Kommas enthält!
quelle
Ihre Frage:
Sie können dies verwenden: https://github.com/MikeMcl/bignumber.js
so was:
quelle
Ich weiß, dass es viele Jahre später ist, aber ich hatte kürzlich an einem ähnlichen Problem gearbeitet und wollte meine Lösung veröffentlichen. Die aktuell akzeptierte Antwort füllt den Exponententeil mit Nullen auf, und meine versucht, die genaue Antwort zu finden, obwohl sie im Allgemeinen für sehr große Zahlen aufgrund der JS-Grenze für die Gleitkommapräzision nicht perfekt genau ist.
Dies funktioniert für
Math.pow(2, 100)
und gibt den korrekten Wert von 1267650600228229401496703205376 zurück.quelle
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
mit einigen Problemen:
quelle
Die regulären Ausdrücke ausschalten. Dies hat keine Präzisionsprobleme und ist nicht viel Code.
quelle
Wenn Sie dies nur zur Anzeige tun, können Sie aus den Ziffern ein Array erstellen, bevor sie gerundet werden.
quelle
Derzeit gibt es keine native Funktion zum Auflösen der wissenschaftlichen Notation. Zu diesem Zweck müssen Sie jedoch Ihre eigenen Funktionen schreiben.
Hier ist mein:
quelle
Sie können ein Exponentialmodul verwenden . Es ist leicht und vollständig getestet.
quelle
Sie können auch YourJS.fullNumber verwenden. Zum Beispiel
YourJS.fullNumber(Number.MAX_VALUE)
ergibt sich Folgendes:179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Es funktioniert auch für sehr kleine Zahlen.
YourJS.fullNumber(Number.MIN_VALUE)
gibt dies zurück:0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
Es ist wichtig zu beachten, dass diese Funktion immer endliche Zahlen als Zeichenfolgen zurückgibt, aber nicht endliche Zahlen (z. B.
NaN
oderInfinity
) alsundefined
.Sie können es hier in der YourJS-Konsole testen .
quelle
Sie können verwenden
number.toString(10.1)
:Hinweis: Dies funktioniert derzeit in Chrome, jedoch nicht in Firefox. Die Spezifikation besagt, dass der Radix eine ganze Zahl sein muss, was zu einem unzuverlässigen Verhalten führt.
quelle
10.1
oder10
oder nichts sind also gleichwertig.Ich hatte das gleiche Problem mit Orakel, das die wissenschaftliche Notation zurückgibt, aber ich brauchte die tatsächliche Nummer für eine URL. Ich habe gerade einen PHP-Trick verwendet, indem ich Null subtrahiert habe, und ich bekomme die richtige Zahl.
Zum Beispiel ist 5.4987E7 der Wert.
newval ist jetzt gleich 54987000
quelle