Konvertieren von Double zu String ohne Präzision Verlust in javascript
Ich würde gerne konvertieren, eine floating point variable in einen string, ohne Verlust von Präzision.
I. e. Ich möchte den string auf die gleichen Informationen haben wie mein floating-point-variable enthält, seit ich den Ausgang für die weitere Verarbeitung (auch wenn es bedeutet, dass der string sehr lang sein und lesbar).
Diese deutlich mehr, würde ich gerne Funktionen für die zyklische Umwandlung
var dA = 323423.23423423e4;
var sA = toString(dA);
var dnA = toDouble(sA);
und ich möchte, dnA-und dA werden gleich
Dank
PS: Quellen im internet in der Regel darüber reden, wie Runde Saiten, aber ich habe keine Informationen gefunden, auf die genaue Darstellung. Auch ich bin nicht daran interessiert, Beliebig genaue Berechnungen muss ich nur double-precision-floating-point-Arithmetik.
- Hat der string muss eine Basis-10-Darstellung von floating-point-Wert?
- ECMA-262 4.3.19 gibt an, dass die JavaScript (eher, EcmaScript) interne Zahlendarstellung ist ein 64-bit-IEEE-754-Wert an. Also, es ist nicht abhängig von der hardware.
- Sicher, aber Sie sind nur gewährleistet, 15-17 Dezimalstellen, so ist es einfach zu erstellen Sie eine Zeichenfolge, die gerundet wird.
- Falls der round-trip war-String → Zahl → Zeichenkette, würde ich dir Zustimmen. Nicht jeder base-10-floating-point-string hat eine exakte Darstellung im 64-bit IEEE 754. Jedoch, das Gegenteil ist anders: jeder IEEE 754 floating-point-Zahl ist, in der Tat, eine genaue String-Darstellung, denn es ist die Summe einer endlichen Menge von Potenzen von 2, von denen jede eine endliche Darstellung zur Basis 10. So ist die round-trip-Reihe → String → Zahl genau.
- Ja, die Frage ist knifflig, wie die. Da die OQ ist (in der Tat), string-> Nummer> Zeichenfolge> Nummer. zB
var dA = 123456323423.23423423e4; var sA = toString(dA); var dnA = toDouble(sA);
Hätte, dnA = dA, aber nicht haben, dA gleich die interpretierte Zeichenfolge "123456323423.23423423e4". Noch, ich bin das löschen meiner ursprünglichen Kommentar, da Sie mehr richtig, als ich bin. - Basis 10 wäre nett, ist nicht erforderlich, obwohl.
- so zu sprechen, möchte ich zum serialisieren des double-variable und ich bin gerade auf der Suche nach garantiert, dass der Standard (eher) implizite Konvertierung wie dA + " ist, dies zu tun und ist nicht Plattform - /browser-spezifisch. Ich habe festgestellt abschneiden der Probleme sehr viel in meiner wissenschaftlichen Karriere und machen Sie es einen Punkt, um Sie zu vermeiden 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Zeichenfolge Arithmetik tun die Zeichenfolge converion, und verwenden Sie dann
parseFloat
um es wieder zu einem Schwimmer:Hier ist ein Turnschuh , um ihn in Aktion zu sehen.
Hinweis: Alle JavaScript-zahlen verdoppelt, so brauchen Sie nicht zu zeichnen eine Unterscheidung zwischen Doppel-und schwimmt. So, der einzige Ort, den Sie brauchen, um sorgen über die Präzision Verlust ist in Ihrer ersten Linie. Zum Beispiel, wenn Sie haben
var dA = 987654321.0123456789
für die erste Zeile, es wäre äquivalent zuvar dA = 987654321.01234567
, unddA
würde gleich nochdnA
am Ende.dA
. Jedoch, wie erwähnt, in meiner Anmerkung, dieser Wert wird weniger präzise als das, was Sie erklärt, es zu sein, wenn deine Erklärung enthält zu viele Ziffern.Nur
dA.toString()
undparseFloat(sA)
sollte es tun.