jsrosetta

Kiểu dữ liệu

Số lớn (BigInt)

BigInt của JavaScript so với math/big (Go), java.math.BigInteger (Java), crate num-bigint (Rust) — Swift không có kiểu số lớn dựng sẵn.

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.60Swift ≥ 2.0Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

number của JavaScript chỉ an toàn tới 2^53 - 1; vượt quá thì phải dùng BigInt, một kiểu nguyên thuỷ riêng với hậu tố n. Go không có kiểu số lớn dựng sẵn trong ngôn ngữ — thay vào đó dùng big.Int từ package math/big, một struct với các phương thức (SetUint64, SetString, Cmp…) thay cho toán tử. Java có java.math.BigInteger sẵn trong java.base, thiết kế gần giống hệt Go. Rust không có gì trong std, phải dùng crate num-bigint. Swift thì không có cả trong stdlib lẫn Foundation — phải dùng package ngoài nếu cần số thật sự lớn.

Tạo và so sánh số lớn

let bn = 75n
console.log(bn.toString(10))
 
bn = BigInt('75')
console.log(bn.toString(10))
 
bn = BigInt(0x4b)
console.log(bn.toString(10))
 
bn = BigInt('0x4b')
console.log(bn.toString(10))
 
bn = BigInt('0x' + Buffer.from('4b', 'hex').toString('hex'))
console.log(bn.toString(10))
console.log(Number(bn))
console.log(bn.toString(16))
console.log(Buffer.from(bn.toString(16), 'hex'))
 
let bn2 = BigInt(100)
let isEqual = bn === bn2
console.log(isEqual)
 
let isGreater = bn > bn2
console.log(isGreater)
 
let isLesser = bn < bn2
console.log(isLesser)
# Node.js
75
75
75
75
75
75
4b
<Buffer 4b>
false
false
true
 
# Go
75
75
75
75
75
75
4b
[75]
false
false
true
 
# Rust
75
75
75
75
75
75
4b
[75]
false
false
true
 
# Swift
75
75
75
75
75
75
4b
[75]
false
false
true
 
# Java
75
75
75
75
75
75
4b
[75]
false
false
true

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#big-numbers