Phương thức xử lý số trong JavaScript

Trong lập trình web các bạn thường xuyên gặp các trường hợp xử lý dữ liệu kiểu number từ client, và phương pháp xử lý nhanh nhất là bằng JavaScript. Trong bài viết mình xin giới thiệu các phương thức xử lý số trong JavaScript. Trong JavaScript, các số nguyên thủy (ví dụ như: 5, 13, -6, 0, ....) không phải là đối tượng, tuy nhiên chúng vẫn có một số phương thức, với việc truy cập vào các phương thức đó, ta có thể làm được một số công việc với các con số, ví dụ như: làm tròn số, chuyển số về dạng chuỗi, ....

Dưới đây là ba phương thức chính thường được dùng để xử lý số trong JavaScript:

  • toString(): Chuyển một giá trị về dạng chuỗi ký tự
  • toExponential(): Trả về chuỗi biểu thức mũ của một số
  • toFixed(): Làm tròn một số đến phần thập phân xác định Ngoài ra, trong JavaScript có thêm ba phương thức toàn cầu dùng để xử lý số:
  • Number(): Phân tích một giá trị để trả về một số tương ứng
  • parseInt(): Phân tích một chuỗi để trả về một số nguyên tương ứng
  • parseFloat(): Phân tích một chuỗi để trả về một số thực tương ứng ví dụ về phương thức Number():
  • Phương thức Number() dùng để phân tích một giá trị để trả về một số tương ứng với giá trị đó.
  • Lưu ý: Nếu giá trị là một đối tượng ngày tháng thì phương thức Number() sẽ trả về tổng số mili giây từ 1/1/1970 đến thời điểm của đối tượng ngày tháng đó. Nếu không thể phân tích giá trị ra số tương ứng thì phương thức Number() sẽ trả về NaN.
<!DOCTYPE html> <html> <body>
<script>
    var a = Number(true);
    var b = Number(false);
    var c = Number(new Date());
    var d = Number("1000");
    var e = Number("10 00");

    document.write(a + "<br>");
    document.write(b + "<br>");
    document.write(c + "<br>");
    document.write(d + "<br>");
    document.write(e + "<br>");
</script>
</body> </html>

Kết quả: 1 0 1503921290818 1000 NaN -> không thể phân tích được số 10 00

  1. Sử dụng số trong JavaScript JavaScript chỉ có một kiểu số. Số có thể được viết kèm với hoặc không dấu chấm thập phân.Số trong JavaScript có thể được viết kèm hoặc không kèm dấu chấm thập phân: Ví dụ:
  var x = 87.00;    // Một số với dấu chấm thập phân
  var y = 87;       // Một số không có dấu chấm thập phân

Các số rất lớn và rất nhỏ có thể được viết dưới dạng biểu thức khoa học: Ví dụ:

  	var x = 123e5;    // 12300000
  	var y = 123e-5;   // 0.00123

Các số trong JavaScript luôn là số thực dấu chấm động 64-bit Không giống như các ngôn ngữ lập trình khác, JavaScript không định nghĩa các kiểu khác nhau về số như: số nguyên, số ngắn, số dài, số thực, vân vân. Số trong JavaScript luôn luôn được lưu trữ như số thực dấu chấm động, theo tiêu chuẩn IEEE 754 quốc tế. Định dạng này lưu trữ các số dưới dạng 64 bít, các số được lưu giữ từ bít 0 đến 51, số mũ từ bít 52 đến 62, và các ký hiệu trong bít 63:

Số Số mũ Ký hiệu
52 bít (0 – 51) 11 bít (52 – 62 1 bít (63)

Độ chính xác Số nguyên (số mà không có ký hiệu số mũ) được coi là chính xác lên đến 15 chữ số.

	Ví dụ:
    	var x = 999999999999999;   // x sẽ là 999999999999999
  	var y = 9999999999999999;  // y sẽ trả về kết quả 10000000000000000

Giá trị cực đại trong hệ thập phân của JavaScript là 17 con số, nhưng dấu chấm động không phải luôn luôn chính xác 100%:

	Ví dụ:
    	var x = 0.2 + 0.4;           // x sẽ có giá trị là 0.6000000000000001
        Để giải quyết vấn đề trên, hãy nhân nó lên và chia ra:
        var x = (0.2*10 + 0.4*10)/10;  // x sẽ có giá trị 0.6

Hệ thập lục phân JavaScript giải nghĩa hằng số thành hệ thập lục phân, nếu chúng đều bắt đầu bằng 0x.

var x = 0xAF;             // x sẽ có giá trị 175 trong hệ thập phân

Không bao giờ viết một số với số 0 ở đầu. Một số phiên bản JavaScript giải nghĩa các số thành hệ bát phân nếu nó được viết với số 0 ở đầu. Theo mặc định, JavaScript hiển thị các con số trong hệ thập phân. Nhưng bạn có thể sử dụng phương thức toString() để biến một số hệ thập phân thành hệ thập lục phân (16), bát phân (8) hoặc nhị phân (2). Ví dụ

var myNumber = 208;
myNumber.toString(16);     // trả về kết quả d0 theo hệ thập lục phân (16)
myNumber.toString(8);      // trả về kết quả 320 theo hệ bát phân (8)
myNumber.toString(2);      // trả về kết quả  11010000 theo hệ nhị phân (2)

Vô cực Dương vô cùng (hoặc âm vô cùng) là giá trị JavaScript sẽ trả về nếu bạn tính toán một số nằm ngoài con số lớn nhất có thể.

    var myNumber = 2;
    while (myNumber != Infinity) {          // Tính toán cho đến khi vượt mốc số lớn nhất
        myNumber = myNumber * myNumber;
    }

Hoặc chia cho số 0;

    var x =  1 / 0;          // x là dương vô cùng
    var y = -1 / 0;          // y là âm vô cùng

NaN – Không phải là số NaN là một từ JavaScript dành riêng để chỉ một giá trị không phải là một số. Các phép toán với một chuỗi không phải là số sẽ cho ra kết quả NaN (Not a Number):

    var x = 100 / “Apple”;  // x sẽ có kết quả là NaN (Not a Number)

Dù sao, nếu chuỗi chỉ bao gồm các con số, kết qua sẽ vẫn là số, thí dụ:

    var x = 100 / “10”;     // x sẽ có giá trị là 10

Bạn có thể sử dụng hàm toàn cục trong JavaScript là isNaN() để biết xem một giá trị có phải là số hay là không.

    var x = 100 / “Apple”;
    isNaN(x);               // sẽ trả về kết quả là true với vì x Không phải là một Số

Nếu bạn sử dụng NaN như một toán tử, kết quả sẽ cho ra NaN:

    var x = NaN;
    var y = 100;
    var z = x + y;         // z sẽ là NaN

Hoặc kết quả là một phép nối:

    var x = NaN;
    var y = “100”;
    var z = x + y;         // z sẽ là NaN100

Điều thú vị có phần kỳ lạ là JavaScript xếp kiểu là của NaN là một số. Khi sử dụng typeof ta sẽ thấy kết quả trả về là một số:

    typeof NaN;             // kết quả trả về là là “number”

Số có thể là đối tượng Thông thường số trong JavaScript là giá trị thuần tuý được tạo ra từ các ký tự biểu thị số: var x = 1000 Nhưng các con số cũng có thể được định nghĩa như là các đối tượng với từ khoá new: var y = new Number(1000)

    var x = 100; // typeof x trả về là number (số)
    var y = new Number(100);// typeof y trả về là object (đối tượng)

Đừng tạo Số thành đối tượng. Điều này có thể làm chậm tốc độ xử lý. Từ khoá new làm code trở nên phức tạp. Điều này có thể tạo ra một số kết quả không mong muốn.

So sánh toán tử "==" và "==="

    var x = 500;
    var y = new Number(500);// (x == y) cho kết quả true vì x và y có cùng giá trị

Khi sử dụng toán tử bằng chặt (===), hai số trên không còn bằng nhau nữa, vì mặc dù giá trị thuần tuý giống nhau, nhưng kiểu của chúng thì khác nhau. Mà bằng chặt yêu cầu cả giá trị và kiểu phải như nhau.

    var x = 500;
    var y = new Number(500);// (x === y) là false bởi vì hai kiểu là khác nhau

Các đối tượng không thể so sánh:

    var x = new Number(500);
    var y = new Number(500);// (x == y) là false, bởi vì các đối tượng (object) không thể so sánh.