Ich befand mich in der Situation, wo ich einen konvertieren wollte BigInt
Wert zu a Number
Wert. Zu wissen, dass mein Wert a ist sichere Ganzzahlwie kann ich es umwandeln?
Wie konvertiere ich BigInt in Number in JavaScript?
Lucio Paiva
Lucio Paiva
Es stellt sich heraus, dass es so einfach ist, es an die weiterzugeben Number
Konstrukteur:
const myBigInt = BigInt(10); // `10n` also works
const myNumber = Number(myBigInt);
Natürlich sollten Sie bedenken, dass Ihr BigInt-Wert innerhalb liegen muss [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER] damit die Konvertierung ordnungsgemäß funktioniert, wie in der Frage angegeben.
-
ich wundere mich warum
+myBigInt
wird noch nicht unterstützt.– Mohammed
15. Dezember 2021 um 7:15 Uhr
-
@Mohammad siehe: github.com/tc39/proposal-bigint/blob/master/…
– Kartik Soneji
23. Dezember 2021 um 19:57 Uhr
Sie können verwenden parseInt
oder Number
const large = BigInt(309);
const b = parseInt(large);
console.log(b);
const n = Number(large);
console.log(n);
-
Aus Leistungsgründen schlage ich vor, nicht zu verwenden
parseInt
dafür. Ja, ja, laut Spezifikation beidesparseInt
undNumber
sollte die Konvertierung durchführen, indem Sie BigInt in eine Zeichenfolge vor einer Zahl konvertieren. Dennoch ist die Semantik vonparseInt
im Vergleich zur Semantik vonNumber
vor allem im Hinblick auf das WieBigInt(number)
ergibt ein BigInt macht es wahrscheinlicher, dass Browser-Anbieter mehr Optimierungen anwenden werdenNumber(bigValue)
alsparseInt(bigValue)
so dass die Stringifizierung intern übersprungen wird. Daher empfehle ich die VerwendungNumber
Anstatt vonparseInt
für Leistung.– Jack G
14. Februar 2020 um 16:59 Uhr
-
@JackGiffin, bitte sehen Sie sich dieses stackoverflow.com/questions/4090518/… wo an
parseInt
kann in manchen Fällen besser sein– I_Al-thamary
14. Februar 2020 um 17:12 Uhr
-
Ich fürchte, ich verstehe es nicht. I stimme zu
parseInt
undNumber
haben unterschiedliche Verhaltensweisen, aber um einen BigInt in eine Zahl umzuwandeln, kann ich mir keine Fälle vorstellen, in denen sie sich unterscheiden würden. Vielleicht kannst du ein Beispiel geben, woNumber
undparseInt
unterscheiden sich in der Umwandlung von BigInts in Zahlen, um mich aufzuklären. Vielen Dank.– Jack G
15. Februar 2020 um 19:44 Uhr
-
@JackGiffin Du hast in diesem Fall vollkommen recht
BigInts
und was ich zeigen muss, ist dasparseInt
undNumber
haben unterschiedliche Verhaltensweisen und Sie können das Beispiel im obigen Link sehen.– I_Al-thamary
15. Februar 2020 um 20:15 Uhr
-
@I_Al-thamary: Best Practice ist die Verwendung von Radix während der Verwendung
parseInt
– Naveen
7. Januar um 13:30 Uhr
zr0gravity7
Bearbeiten: Siehe die Diskussion in den Kommentaren unten, warum diese Antwort so ist nicht Korrekt. Ich lasse die Antwort trotzdem für die Begriffsklärung offen.
Sie sollten eine der statischen Methoden verwenden:
BigInt.asIntN()
– Klemmt einen BigInt-Wert auf einen vorzeichenbehafteten ganzzahligen Wert und gibt diesen Wert zurück.
BigInt.asUintN()
– Klemmt einen BigInt-Wert auf einen vorzeichenlosen ganzzahligen Wert und gibt diesen Wert zurück.
wie hier dokumentiert: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#static_methods
-
@zr0gravity7 @naveen, ich hatte die Gelegenheit, dies zu testen, und diese Methoden geben keine Zahlen zurück, sondern stattdessen BigInt-Werte. Ihre Namen sind irreführend, da die
N
schlägt vorNumber
, obwohl sie tatsächlich immer noch BigInt-Werte zurückgeben. Versuchen Sie es mit Laufentypeof BigInt.asIntN(64, 1n)
um zu sehen, dass es berichtetbigint
. Diese Antwort beantwortet also eigentlich nicht die Frage.– Lucio Paiva
7. Januar um 14:57 Uhr
-
Stimmt das. Ein verwirrender Name. Habe die Dokumentation gelesen. <3
– Naveen
7. Januar um 15:42 Uhr
-
Die Erklärung des Namens ist, dass „intN“ die Verallgemeinerung von „int32“, „int64“, „int555“ und so weiter ist; oder anders ausgedrückt: “intN” ist die Abkürzung für “N-Bit Integer”. Der Wert dieses N ist der erste Parameter der Funktion. Eine alternative Spezifikation hätte bereitgestellt werden können
BigInt.asInt64(x)
undBigInt.asInt32(x)
aber für maximale Flexibilität wurde die Entscheidung getroffen, einen Single zu habenBigInt.asIntN(N, x)
stattdessen.– jmrk
12. Januar um 11:35 Uhr
-
as(Ui|I)ntN
macht weder das, was Sie behaupten, noch beantwortet dies die Frage von OP. Diese Funktionen nehmen einen BigInt und geben einen BigInt modulo 2^N zurück.– Chris_F
3. August um 7:32
Beziehen Sie sich auf den Vorschlag für Stufe 3? Das wäre dort dokumentiert.
– Sebastian Simon
29. Dezember 2018 um 15:03 Uhr
Schön @Xufox, danke für die Bearbeitung.
– Lucio Paiva
29. Dezember 2018 um 15:14 Uhr