Unterstützt JavaScript 64-Bit-Ganzzahlen?

81

Ich habe folgenden Code:

var str = "0x4000000000000000";   //4611686018427387904 decimal
var val = parseInt(str);
alert(val);

Ich bekomme diesen Wert: " 4611686018427388000", was ist0x4000000000000060

Ich habe mich gefragt, ob JavaScript 64-Bit-Ganzzahlen falsch behandelt oder ob ich etwas falsch mache.

ahmd0
quelle

Antworten:

87

JavaScript repräsentiert Zahlen im IEEE-754 -Format mit doppelter Genauigkeit (64 Bit). Soweit ich weiß, erhalten Sie eine Genauigkeit von 53 Bit oder fünfzehn bis sechzehn Dezimalstellen. Ihre Nummer hat mehr Ziffern, als JavaScript verarbeiten kann, sodass Sie eine Annäherung erhalten.

Dies ist als solches kein wirklicher "Missbrauch", aber offensichtlich ist es nicht sehr hilfreich, wenn Sie bei großen Zahlen volle Präzision benötigen. Es gibt einige JS-Bibliotheken, die größere Zahlen verarbeiten können, z. B. BigNumber und Int64 .

nnnnnn
quelle
2
Goog.math.Long von Closure kann ebenfalls hilfreich sein: docs.closure-library.googlecode.com/git/…
Jeremy Condit
38
Man sollte vielleicht hinzufügen, dass Operationen auf Bitebene auf 32-Bit-IIUC beschränkt sind.
Sellibitze
2
goog.math.Long Dokumentation wurde verschoben: google.github.io/closure-library/api/class_goog_math_Long.html
benizi
5
(Kommentar von @Michaelangelo ) Leider haben die ECMAScript 2015-Spezifikationen (Version 6) keine offizielle Unterstützung für UInt64; Während Mozilla die Unterstützung für UInt64 hinzugefügt hat, ist dies kein Standard. WebGL hat ähnliche Anforderungen, aber leider gibt es auch keine Uint64Array, nur Uint32Array .
Falsarella
2
goog.math.Long Dokumentation wurde wieder verschoben: google.github.io/closure-library/api/goog.math.Long.html (Danke, @Pacerier)
Benizi
10

Chromium Version 57 und höher unterstützt nativ Ganzzahlen mit beliebiger Genauigkeit. Dies heißt BigInt und wird auch für andere Browser bearbeitet . Es ist dramatisch schneller als JavaScript-Implementierungen.

Shnatsel
quelle
Wird auch von Opera 54+ und Node.js unterstützt. Firefox 65+ unterstützt dies, wenn das javascript.options.bigintFlag aktiviert ist.
David Callanan
Es ist nicht immer schneller. Vergleichen Sie dies mit console.time("go");for (var i=0;i<10000000;++i) {} console.timeEnd("go");64-Bit-Zahlenconsole.time("go");for (var i=0n;i<10000000n;++i) {} console.timeEnd("go");
Cibo FATA8
@ CiboFATA8: Er spricht über BigInt als native Browserkomponente im Vergleich zu BigInt, das in JavaScript implementiert ist. Sie vergleichen js Numbers, bei denen es sich um Floats mit einer Genauigkeit von etwa 53 Bit (nicht 64) handelt, mit dem nativen Browser BigInt (ebenfalls nicht 64 Bit).
Hippietrail