Thuộc tính của Number trong JavaScript

Javascript căn bản | by Học Javascript

Trong JavaScript, Number là kiểu dữ liệu được sử dụng để biểu diễn cả số nguyên và số thực. Khác với một số ngôn ngữ lập trình khác, JavaScript không phân biệt giữa số nguyên (int) và số thực (float), tất cả đều thuộc kiểu Number.

Tuy nhiên, khi làm việc với số, lập trình viên có thể gặp phải nhiều vấn đề như giới hạn giá trị, lỗi chính xác khi xử lý số thực, hoặc các phép toán không hợp lệ dẫn đến kết quả NaN (Not-a-Number). Để giúp quản lý và xử lý số hiệu quả hơn, JavaScript cung cấp nhiều thuộc tính hữu ích trong đối tượng Number, chẳng hạn như MAX_VALUE, MIN_VALUE, POSITIVE_INFINITY, NaN, EPSILON, v.v.

Các thuộc tính này đóng vai trò quan trọng trong việc kiểm tra, so sánh và xử lý số liệu chính xác. Chúng được ứng dụng rộng rãi trong nhiều lĩnh vực, từ tính toán tài chính, xử lý dữ liệu lớn, mã hóa, đến phát triển game và khoa học dữ liệu. Việc hiểu và sử dụng đúng các thuộc tính của Number giúp lập trình viên tránh lỗi và tối ưu hiệu suất cho ứng dụng của mình.

Các thuộc tính của Number trong JavaScript

Trong JavaScript, Number là một đối tượng tích hợp sẵn chứa nhiều thuộc tính hữu ích để làm việc với số. Dưới đây là danh sách các thuộc tính quan trọng của Number, cùng với mô tả chi tiết và ví dụ minh họa.

Number.MAX_VALUE

Mô tả:
Đây là giá trị số lớn nhất có thể được biểu diễn trong JavaScript. Nếu một số vượt quá giá trị này, nó sẽ trở thành Infinity.

Ví dụ minh họa:

console.log(Number.MAX_VALUE); 
// Output: 1.7976931348623157e+308 (≈ 1.8 × 10³⁰⁸)
console.log(Number.MAX_VALUE * 2); 
// Output: Infinity (vì vượt quá giới hạn)

Number.MIN_VALUE

Mô tả:
Đây là số dương nhỏ nhất có thể biểu diễn trong JavaScript (≈ 5 × 10⁻³²⁴). Lưu ý rằng nó không phải là số âm nhỏ nhất, mà là số dương gần bằng 0 nhất có thể có.

Ví dụ minh họa:

console.log(Number.MIN_VALUE); 
// Output: 5e-324 (≈ 5 × 10⁻³²⁴)
console.log(Number.MIN_VALUE > 0); 
// Output: true (vì đây là số dương)

Number.POSITIVE_INFINITY

Mô tả:
Đại diện cho giá trị dương vô cực (Infinity). Nếu một số lớn hơn Number.MAX_VALUE, JavaScript sẽ tự động chuyển nó thành Infinity.

Ví dụ minh họa:

console.log(1 / 0); 
// Output: Infinity
console.log(Number.MAX_VALUE * 2); 
// Output: Infinity
console.log(Number.POSITIVE_INFINITY > Number.MAX_VALUE); 
// Output: true

Number.NEGATIVE_INFINITY

Mô tả:
Đại diện cho giá trị âm vô cực (-Infinity). Nếu một số nhỏ hơn Number.MIN_VALUE, JavaScript sẽ gán nó là -Infinity.

Ví dụ

console.log(-1 / 0); 
// Output: -Infinity
console.log(-Number.MAX_VALUE * 2); 
// Output: -Infinity
console.log(Number.NEGATIVE_INFINITY < -Number.MAX_VALUE); 
// Output: true

Number.NaN (Not-a-Number)

Mô tả:
Đại diện cho giá trị không phải số hợp lệ (NaN). Xuất hiện khi thực hiện phép toán không hợp lệ, chẳng hạn như nhân chuỗi với số.

Ví dụ minh họa:

console.log("abc" * 10); 
// Output: NaN
console.log(0 / 0); 
// Output: NaN
console.log(isNaN("hello")); 
// Output: true (vì "hello" không thể chuyển thành số)

Number.EPSILON

Mô tả:
EPSILON là giá trị chênh lệch nhỏ nhất giữa hai số dấu chấm động có thể phân biệt trong JavaScript. Điều này rất hữu ích khi so sánh số thực, vì trong máy tính, phép toán số thực có thể không chính xác.

Ví dụ minh họa:

console.log(0.1 + 0.2 === 0.3); 
// Output: false (do lỗi số thực)
console.log(Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON); 
// Output: true (vì chênh lệch nhỏ hơn sai số cho phép)

Number.MAX_SAFE_INTEGER

Mô tả:
Đây là số nguyên lớn nhất có thể biểu diễn chính xác trong JavaScript, tương đương 2^53 - 1 (9007199254740991).

Ví dụ minh họa

console.log(Number.MAX_SAFE_INTEGER); 
// Output: 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); 
// Output: true (vì mất độ chính xác)

Number.MIN_SAFE_INTEGER

Mô tả:
Đây là số nguyên nhỏ nhất có thể biểu diễn chính xác trong JavaScript, tương đương -(2^53 - 1) (-9007199254740991).

Ví dụ minh họa:

console.log(Number.MIN_SAFE_INTEGER); 
// Output: -9007199254740991
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2); 
// Output: true (vì mất độ chính xác)
Thuộc tính Giá trị & Ý nghĩa
Number.MAX_VALUE Số lớn nhất có thể biểu diễn (~1.8 × 10³⁰⁸)
Number.MIN_VALUE Số dương nhỏ nhất có thể biểu diễn (~5 × 10⁻³²⁴)
Number.POSITIVE_INFINITY Đại diện cho dương vô cực
Number.NEGATIVE_INFINITY Đại diện cho âm vô cực
Number.NaN Đại diện cho giá trị không hợp lệ (Not-a-Number)
Number.EPSILON Sai số nhỏ nhất giữa hai số dấu chấm động
Number.MAX_SAFE_INTEGER Số nguyên lớn nhất có thể biểu diễn chính xác (2⁵³ - 1)
Number.MIN_SAFE_INTEGER Số nguyên nhỏ nhất có thể biểu diễn chính xác (-2⁵³ + 1)

Các lỗi thường gặp khi làm việc với thuộc tính Number trong JavaScript

Khi làm việc với số trong JavaScript, có một số lỗi phổ biến có thể xảy ra do giới hạn của kiểu dữ liệu Number. Dưới đây là ba lỗi thường gặp và cách khắc phục chúng.

Lỗi khi làm việc với số vượt quá MAX_SAFE_INTEGER

Nguyên nhân

  • Trong JavaScript, số nguyên lớn nhất có thể được biểu diễn chính xácNumber.MAX_SAFE_INTEGER (9007199254740991).
  • Nếu một số vượt quá giá trị này, các phép toán số học có thể không chính xác.

Ví dụ lỗi

console.log(Number.MAX_SAFE_INTEGER); 
// Output: 9007199254740991

console.log(Number.MAX_SAFE_INTEGER + 1); 
// Output: 9007199254740992 (Đúng)

console.log(Number.MAX_SAFE_INTEGER + 2); 
// Output: 9007199254740992 (Sai! Lẽ ra phải là 9007199254740993)

Lỗi xảy ra vì các số nguyên lớn hơn Number.MAX_SAFE_INTEGER không thể được lưu trữ chính xác.

Giải pháp: Sử dụng BigInt

BigInt là kiểu dữ liệu mới trong JavaScript giúp xử lý các số nguyên rất lớn một cách chính xác.

let bigNumber = BigInt(Number.MAX_SAFE_INTEGER);
console.log(bigNumber + 2n); 
// Output: 9007199254740993n (Đúng)
  • BigInt cho phép lưu trữ và thực hiện các phép toán trên số nguyên lớn mà không bị mất độ chính xác.
  • Lưu ý rằng BigInt không thể được sử dụng chung với kiểu Number trong các phép toán.

Lỗi khi so sánh số thực với sai số nhỏ (Floating-Point Precision Error)

Nguyên nhân

  • JavaScript sử dụng chuẩn IEEE 754 cho số dấu chấm động, dẫn đến các lỗi chính xác khi thực hiện phép toán số thực.
  • Một ví dụ điển hình là 0.1 + 0.2 !== 0.3 do sai số dấu chấm động.

Ví dụ lỗi

console.log(0.1 + 0.2); 
// Output: 0.30000000000000004 (Sai!)

console.log(0.1 + 0.2 === 0.3); 
// Output: false (vì 0.30000000000000004 !== 0.3)

Giải pháp: Sử dụng Number.EPSILON để kiểm tra sai số

Thay vì so sánh trực tiếp, chúng ta sử dụng Number.EPSILON để kiểm tra xem sai số có nhỏ hơn một giá trị nhất định không.

function isEqual(a, b) {
    return Math.abs(a - b) < Number.EPSILON;
}

console.log(isEqual(0.1 + 0.2, 0.3)); 
// Output: true (Đúng!)
  • Number.EPSILON (~2.22 × 10⁻¹⁶) là giá trị chênh lệch nhỏ nhất giữa hai số dấu chấm động có thể phân biệt.
  • Sử dụng phương pháp này giúp đảm bảo kết quả chính xác hơn khi so sánh số thực.

Lỗi NaN khi thực hiện phép toán không hợp lệ

Nguyên nhân

NaN (Not-a-Number) xuất hiện khi thực hiện phép toán không hợp lệ với số.

Một số trường hợp phổ biến gây ra NaN:

  • Nhân chuỗi với số ("abc" * 10)
  • Chia 0/0
  • Phân tích số không hợp lệ (parseInt("abc"))

Ví dụ lỗi

console.log("abc" * 10); 
// Output: NaN

console.log(0 / 0); 
// Output: NaN

console.log(parseInt("abc")); 
// Output: NaN

Giải pháp: Kiểm Tra Bằng isNaN()

Để tránh lỗi NaN, hãy kiểm tra giá trị trước khi thực hiện phép toán.

function safeMultiply(a, b) {
    if (isNaN(a) || isNaN(b)) {
        return "Lỗi: Không thể thực hiện phép toán với NaN!";
    }
    return a * b;
}

console.log(safeMultiply("abc", 10)); 
// Output: "Lỗi: Không thể thực hiện phép toán với NaN!"
  • isNaN(value) giúp kiểm tra xem một giá trị có phải là số hợp lệ hay không.
  • Nếu giá trị là NaN, chương trình có thể xử lý lỗi thay vì tiếp tục thực hiện phép toán sai.
Lỗi Nguyên Nhân Giải Pháp
Lỗi khi làm việc với số vượt quá MAX_SAFE_INTEGER Số nguyên quá lớn mất độ chính xác. Dùng BigInt để xử lý số nguyên lớn.
Lỗi khi so sánh số thực (Floating-Point Precision Error) Do chuẩn IEEE 754, số thực có sai số. Dùng Number.EPSILON để kiểm tra sai số khi so sánh.
Lỗi NaN khi thực hiện phép toán không hợp lệ Phép toán với giá trị không hợp lệ ("abc" * 10, 0 / 0, parseInt("abc")). Dùng isNaN() để kiểm tra trước khi tính toán.

Ứng dụng thực tế của các thuộc tính Number trong JavaScript

Thuộc tính Number trong JavaScript đóng vai trò quan trọng trong nhiều lĩnh vực thực tế, từ tính toán tài chính đến mã hóa và khoa học dữ liệu. Dưới đây là những ứng dụng phổ biến của chúng.

Xử lý giới hạn số trong tính toán tài chính (MAX_VALUE, MIN_VALUE)

Vấn đề

  • Khi thực hiện các phép tính tài chính như lãi suất, tiền lương, hoặc thuế, các giá trị có thể trở nên rất lớn hoặc rất nhỏ.
  • Nếu giá trị vượt quá Number.MAX_VALUE, nó sẽ được biểu diễn là Infinity, gây sai số nghiêm trọng.
  • Nếu một số quá nhỏ (nhỏ hơn Number.MIN_VALUE), nó có thể bị làm tròn thành 0, mất đi độ chính xác.

Ứng dụng thực tế

Ví dụ: Một ngân hàng tính tổng số tiền gửi của khách hàng. Nếu số tiền quá lớn, hệ thống cần cảnh báo thay vì tiếp tục tính toán sai.

function checkAmount(amount) {
    if (amount > Number.MAX_VALUE) {
        return "Lỗi: Giá trị quá lớn!";
    } else if (amount < Number.MIN_VALUE && amount !== 0) {
        return "Lỗi: Giá trị quá nhỏ!";
    }
    return "Số tiền hợp lệ: " + amount;
}

console.log(checkAmount(1.8e308)); // "Lỗi: Giá trị quá lớn!"
console.log(checkAmount(5e-324));  // "Số tiền hợp lệ: 5e-324"
console.log(checkAmount(1e-325));  // "Lỗi: Giá trị quá nhỏ!"

  • Number.MAX_VALUE (~1.79 × 10³⁰⁸) giới hạn số lớn nhất có thể biểu diễn chính xác.
  • Number.MIN_VALUE (~5 × 10⁻³²⁴) là số dương nhỏ nhất khác 0 có thể lưu trữ.

Phát hiện lỗi toán học và kiểm tra giá trị hợp lệ (NaN, EPSILON)

Vấn đề

  • Khi nhập dữ liệu không hợp lệ vào phép toán (ví dụ: nhân một chuỗi với số), JavaScript trả về NaN.
  • Do lỗi số thực (Floating-point precision), một số phép toán không chính xác, như 0.1 + 0.2 !== 0.3.

Kiểm tra dữ liệu nhập có hợp lệ không (tránh NaN)

function safeDivide(a, b) {
    if (isNaN(a) || isNaN(b)) {
        return "Lỗi: Giá trị không hợp lệ!";
    }
    return a / b;
}

console.log(safeDivide("abc", 10)); // "Lỗi: Giá trị không hợp lệ!"
console.log(safeDivide(20, 5)); // 4

Giải quyết lỗi số thực (EPSILON) trong tài chính

function isEqual(a, b) {
    return Math.abs(a - b) < Number.EPSILON;
}

console.log(isEqual(0.1 + 0.2, 0.3)); // true (Giải pháp đúng)
console.log(0.1 + 0.2 === 0.3); // false (Sai!)
  • NaN giúp phát hiện lỗi toán học sớm.
  • Number.EPSILON giúp so sánh số thực chính xác hơn, tránh sai số trong các phép tính tiền tệ.

Làm việc với số nguyên lớn trong mã hóa, Blockchain (MAX_SAFE_INTEGER, MIN_SAFE_INTEGER)

Vấn đề

  • Trong các hệ thống mã hóa hoặc blockchain, các số nguyên rất lớn được sử dụng để tạo khóa bảo mật.
  • JavaScript chỉ có thể biểu diễn chính xác các số nguyên trong khoảng từ -(2^53 - 1) đến (2^53 - 1).

Xác minh số nguyên có vượt giới hạn hay không

function checkSafeInteger(num) {
    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
        return "Lỗi: Số nguyên vượt giới hạn an toàn!";
    }
    return "Số hợp lệ: " + num;
}

console.log(checkSafeInteger(9007199254740991)); // "Số hợp lệ: 9007199254740991"
console.log(checkSafeInteger(9007199254740992)); // "Lỗi: Số nguyên vượt giới hạn an toàn!"

Sử dụng BigInt cho số lớn trong blockchain

let bigNumber = BigInt("123456789012345678901234567890");
console.log(bigNumber * 2n); // 246913578024691357802469135780n
  • MAX_SAFE_INTEGER (~9 × 10¹⁵) là số nguyên lớn nhất có thể biểu diễn chính xác bằng Number.
  • BigInt hỗ trợ xử lý số nguyên lớn trong mã hóa, chữ ký số, và blockchain.

Xử lý số vô cực trong các phép toán khoa học (POSITIVE_INFINITY, NEGATIVE_INFINITY)

Vấn đề

  • Khi tính toán trong vật lý, thiên văn học, hoặc AI, có thể xuất hiện giá trị vô cực do chia số lớn cho số nhỏ.
  • Nếu không xử lý đúng, chương trình có thể bị lỗi hoặc cho ra kết quả không mong muốn.

Xử lý giá trị vô cực khi chia cho 0

function safeDivide(a, b) {
    if (b === 0) {
        return a > 0 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
    }
    return a / b;
}

console.log(safeDivide(100, 0));  // Infinity
console.log(safeDivide(-100, 0)); // -Infinity
console.log(safeDivide(100, 5));  // 20

Giới hạn giá trị đầu vào để tránh vô cực trong AI

function normalize(value) {
    if (value > Number.MAX_VALUE) return Number.POSITIVE_INFINITY;
    if (value < -Number.MAX_VALUE) return Number.NEGATIVE_INFINITY;
    return value;
}

console.log(normalize(1.8e308));  // Infinity
console.log(normalize(-1.8e308)); // -Infinity
console.log(normalize(1000));     // 1000

POSITIVE_INFINITYNEGATIVE_INFINITY giúp xử lý các phép toán khoa học có giá trị lớn hoặc nhỏ vô hạn.

Ứng Dụng Thuộc Tính Sử Dụng Ví Dụ Thực Tế
Tính toán tài chính MAX_VALUE, MIN_VALUE Kiểm tra giới hạn số tiền lớn/nhỏ.
Kiểm tra lỗi toán học NaN, EPSILON Kiểm tra số hợp lệ, xử lý sai số dấu chấm động.
Mã hóa, blockchain MAX_SAFE_INTEGER, MIN_SAFE_INTEGER Xử lý số nguyên lớn, sinh khóa mã hóa.
Tính toán khoa học POSITIVE_INFINITY, NEGATIVE_INFINITY

Xử lý phép chia cho 0, tránh lỗi vô cực.

Kết bài

Thuộc tính của Number trong JavaScript đóng vai trò quan trọng trong việc xử lý số một cách chính xác và hiệu quả. Chúng giúp lập trình viên kiểm soát giới hạn số (MAX_VALUE, MIN_VALUE), đảm bảo tính toàn vẹn của dữ liệu (MAX_SAFE_INTEGER, MIN_SAFE_INTEGER), xử lý lỗi số học (NaN, EPSILON), và làm việc với các giá trị vô cực (POSITIVE_INFINITY, NEGATIVE_INFINITY).

Nhờ những thuộc tính này, JavaScript có thể được ứng dụng rộng rãi trong các lĩnh vực như tài chính, khoa học dữ liệu, mã hóa, blockchain và trí tuệ nhân tạo. Hiểu rõ cách sử dụng và hạn chế của từng thuộc tính không chỉ giúp tránh lỗi phổ biến mà còn tối ưu hóa hiệu suất và độ chính xác trong các chương trình JavaScript.

Việc nắm vững và vận dụng linh hoạt các thuộc tính Number sẽ giúp lập trình viên xây dựng ứng dụng mạnh mẽ, đáng tin cậy, đáp ứng tốt các yêu cầu tính toán phức tạp.

Bài viết liên quan

  • 2