Sunday, September 29, 2024

[Javascript] – Phần 22: JavaScript BigInt

-

Trong JavaScript, BigInt là một kiểu dữ liệu mới được sử dụng để lưu trữ giá trị số nguyên lớn quá giới hạn của kiểu dữ liệu Number thông thường.

Trong JavaScript, số nguyên được biểu diễn chính xác tới 15 chữ số khi sử dụng kiểu dữ liệu Number:

let x = 999999999999999;  // Chính xác
let y = 9999999999999999; // Mất chính xác, bị làm tròn

Tất cả các số trong JavaScript được lưu trữ theo định dạng dấu chấm động 64-bit (theo chuẩn IEEE 754). Điều này có nghĩa là số nguyên lớn không thể được biểu diễn chính xác và sẽ bị làm tròn.

Do đó, JavaScript chỉ có thể biểu diễn số nguyên một cách an toàn:

  • Lên đến 9007199254740991 (2^53-1)
  • Xuống đến -9007199254740991 (-(2^53-1))

Giá trị số nguyên nằm ngoài phạm vi này sẽ mất chính xác.

Để tạo một BigInt, bạn có thể thêm “n” vào cuối một số nguyên hoặc sử dụng hàm BigInt():

let x = 9999999999999999n;
let y = BigInt(1234567890123456789012345);
  • Kiểu dữ liệu BigInt là kiểu dữ liệu số thứ hai trong JavaScript (sau Number). Dưới đây là một số kiểu dữ liệu chính trong JavaScript:
    • String
    • Number
    • BigInt
    • Boolean
    • Undefined
    • Null
    • Symbol
    • Object

Các toán tử mà bạn sử dụng trên một số nguyên thông thường trong JavaScript cũng có thể được sử dụng trên BigInt.

Ví dụ

let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

Lưu ý rằng phép tính giữa một BigInt và một Number không được phép (chuyển đổi kiểu dữ liệu sẽ mất thông tin).

Quy tắc dịch phải (>>>) không thể được thực hiện trên một BigInt (nó không có chiều rộng cố định).

Lưu ý rằng khi chia một BigInt, bạn không thể có phần thập phân. Để sử dụng phần thập phân, bạn có thể chuyển đổi BigInt thành Number trước khi thực hiện phép toán. Ví dụ về phép chia với BigInt:

let x = 5n;
let y = x / 2;
// Lỗi: Không thể kết hợp giữa BigInt và các kiểu khác, cần sử dụng chuyển đổi rõ ràng.
let x = 5n;
let y = Number(x) / 2;

BigInt cũng có thể được biểu diễn dưới dạng hệ thống số hexadécimal, octal hoặc binary:

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

Điều này giúp bạn biểu diễn các số lớn theo các hệ thống số khác nhau.

Ví dụ về sự chệch lệch chính xác trong môi trường số học:

9007199254740992 === 9007199254740993; // true !!!

Sự chệch lệch chính xác có thể gây ra vấn đề bảo mật trong một số trường hợp.

BigInt được hỗ trợ trên tất cả các trình duyệt từ tháng 9 năm 2020 trở đi.

Trong ES6 (ECMAScript 2015), đã thêm các thuộc tính max và min vào đối tượng Number:

  • MAX_SAFE_INTEGER: Số nguyên an toàn lớn nhất.
  • MIN_SAFE_INTEGER: Số nguyên an toàn nhỏ nhất.

Ví dụ về sử dụng MAX_SAFE_INTEGER:

let x = Number.MAX_SAFE_INTEGER;

Ví dụ về sử dụng MIN_SAFE_INTEGER:

let x = Number.MIN_SAFE_INTEGER;

Ngoài ra, ES6 cũng thêm 2 phương thức mới vào đối tượng Number:

Number.isInteger(): Phương thức này trả về true nếu đối số là một số nguyên.

Ví dụ:

Number.isInteger(10);    // true
Number.isInteger(10.5);  // false

Number.isSafeInteger(): Một số nguyên an toàn là một số nguyên có thể biểu diễn chính xác dưới dạng số thực có độ chính xác kép.

Phương thức Number.isSafeInteger() trả về true nếu đối số là một số nguyên an toàn.

Ví dụ:

Number.isSafeInteger(10);                  // true
Number.isSafeInteger(12345678901234567890); // false

Số nguyên an toàn bao gồm tất cả các số nguyên từ -(2^53 – 1) đến +(2^53 – 1). Ví dụ 9007199254740991 là an toàn nhưng 9007199254740992 không an toàn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories