08. Kiểu dữ liệu số trong JavaScript (Phần 1) - Number
Dẫn nhập
Ở các bài trước, Kteam đã cùng bạn làm Bài tập về biến trong JavaScript
Ở bài này, chúng ta sẽ cùng tìm hiểu một thứ mới mẻ hơn, nhưng cũng khá quen thuộc đó là số. Cụ thể là kiểu dữ liệu số trong JavaScript
Nội dung
Để có thể hiểu được nội dung của bài, bạn cần có:
- Hiểu được các kiến thức về biến trong JavaScript
- Có các kiến thức về số học
Ở bài này, chúng ta sẽ cùng tìm hiểu về….
- Số trong JavaScript
- Các toán tử cơ bản đối với số trong JavaScript
- Độ ưu tiên các toán tử (+, - , *, /)
- Sự nhầm lẫn khi tính toán với số thực
Nhắc lại các kiến thức về số học
Hàng ngày, chúng ta tiếp xúc rất nhiều với số, ví dụ như: Hôm nay là ngày bao nhiêu? Bạn mua đồ ăn sáng hết bao nhiêu tiền ? Bài kiểm tra vừa rồi được bao nhiêu điểm ? …. Tất cả đều là những con số.
Với số, ta có thể thực hiện các phép so sánh, cộng, trừ, nhân, chia, và rất nhiều phép tính khác.
Số cũng được chia thành nhiều loại, trong phạm vi bài này Kteam sẽ đề cập đến số nguyên và số thực.
Số trong JavaScript
Các giá trị số trong JavaScript đều thuộc một kiểu dữ liệu duy nhất, bất kể nó là số thực hay số nguyên.
Các toán tử đối với số trong JavaScript
Các toán tử số học
Trong bài trước, chúng ta đã cùng tìm hiểu về các toán tử so sánh.
Đối với các toán tử dùng để tính toán, thì nó thực chất cũng giống như các phép tính số học mà ta được học. Các toán tử này lần lượt là +, -, *, /, %, **.
Dưới đây là một số toán tử cơ bản đối với số trong JavaScript
Kí hiệu trong | Kí hiệu toán học | Ví dụ | Ghi chú |
+ | + | 3 + 2 | Phép cộng |
- | - | 1 - 2 | Phép trừ |
* | x | 2 * 2.5 // 5 | Phép nhân |
/ | ÷ | 10 / 2 | Phép chia |
% | MOD | 6 % 4 | Chia lấy dư |
** | ^ | 2**3 | Phép lũy thừa |
Bạn cần lưu ý một số điểm sau:
- Trong phép chia, nếu đó là phép chia hết thì kết quả trả về là số nguyên, còn nếu không chia hết, thì trả về số thập phân
- Đối với phép chia cho số 0, kết quả trả về là Infinity hoặc -Infinity, phụ thuộc vào dấu của số bị chia
- Đối với phép chia lấy dư cho 0, kết quả luôn là NaN (Not a Number)
- Các phép tính có độ ưu tiên giống như khi ta thực hiện bên toán, riêng phép chia lấy dư được ưu tiên giống với các phép nhân, chia
Ngoài ra, nếu muốn thực hiện một phép toán với một biến và gán kết quả cho chính biến đó, ta chỉ cần dùng toán tử tính toán kèm theo toán tử gán:
Bitwise operator.
Đây là một phần “mở rộng”. Để có thể rõ hơn, các bạn có thể tham khảo tại: Expressions and operators
Trước khi đến với các bitwise operator, thì mình sẽ nói sơ qua về khái niệm hệ nhị phân dành cho những ai chưa biết.
Cụ thể, có nhiều cách biểu thị các giá trị số theo nhiều hệ đếm khác nhau. Ví dụ như:
- Hệ thập phân dùng các con số 0..9 để biểu thị các số. Ví dụ: 21, 98, …
- Hệ tam phân thì dùng các con số 0..2 để biểu diễn các giá trị, ví dụ: 210, 21.
- Hệ thập lục phân thì dùng các số từ 0..9 và các kí tự a, b, c, d, e, f để biểu diễn các số. Ví dụ: 12f, 3c, …
Từ những ví dụ trên, chắc các bạn cũng biết cách mà hệ nhị phân biểu diễn các con số rồi phải không?
Hệ nhị phân dùng 2 số 0 và 1 để biểu diễn các giá trị. Ví dụ: 011, 100, 111, 10101, …
Và, một giá trị số có thể được chuyển qua lại giữa các hệ đếm, ví dụ với số 50:
HỆ ĐẾM | GIÁ TRỊ |
Hệ thập phân | 50 |
Hệ nhị phân | 0110010 |
Hệ bát phân | 062 |
Hệ thập lục phân | 32 |
Trong JavaScript, các số được biểu diễn dưới dạng các dãy bit dài 32 kí tự. Do đó, trong JavaScript, thì:
- 1001 được biểu diễn là 0000..0000(28 số 0)1001.
- 101 được biểu diễn là 000..00(29 số 0)101.
Đối với các bitwise operator, các thao tác sẽ được thực hiện trên các bit (tương tự như hệ nhị phân). Cụ thể, đối với các toán tử & (AND), | (OR), ^ (XOR), thì chúng sẽ so sánh từng cặp bit của 2 toán hạng (sau khi đã chuyển toàn bộ về hệ nhị phân), và trả về kết quả tương ứng và thêm vào dãy kết quả. Cuối cùng, dãy kết quả này lại được chuyển về hệ thập phân.
Công dụng của chúng được thể hiện như sau:
TÊN TOÁN TỬ | TÁC DỤNG |
& (AND) | Trả về 1 nếu cả 2 bit đều là 1. |
| (OR) | Trả về 1 nếu có ít nhất một trong 2 bit bằng 1. |
^ (XOR) | Trả về 1 nếu như một trong 2 bit là 1, và bit còn lại bằng 0. |
Còn đối với các toán tử ~(NOT), << (Zero fill left shift), >> (Signed right shift) và >>> (Zero fill right shift), thì chúng sẽ tác động trực tiếp lên dãy bit đang được chỉ định và trả về kết quả dưới dạng thập phân.
TÊN TOÁN TỬ | TÁC DỤNG |
~ (NOT) | Chuyển các bit trong dãy từ 1 à 0, và ngược lại (từ 0 à 1) |
<< | Dịch trái (loại bỏ một vài bit ở đầu dãy, và thêm các số 0 vào cuối dãy sao cho độ dài dãy bằng với ban đầu) |
>>> | Dịch phải (tương tự như dịch trái, nhưng loại bỏ các bit bên phải và thêm vào đầu dãy) |
Ví dụ:
Các toán tử một ngôi
JavaScript cũng hỗ trợ các toán tử một ngôi và nó được sử dụng trong trường hợp mà ta muốn thay đổi giá trị của một biến, với các thao tác cộng thêm một (++) hay trừ đi một (--).
Ví dụ:
Cụ thể:
- Toán tử đặt trước biến, sẽ thay đổi giá trị của biến, sau đó mới thực hiện câu lệnh chứa nó
- Toán tử đặt sau biến, sẽ thực hiện câu lệnh chứa nó trước, sau đó mới thay đổi giá trị của biến
Ngoài ra, đối với JavaScript ta có thể đặt dấu + trước một giá trị nào đó để chuyển nó thành số, ví dụ:
Dấu trừ cũng có thể được sử dụng, nhưng nó sẽ trả về giá trị đối so với khi mà ta dùng dấu +.
Tránh nhầm lẫn khi tính toán với số thực
Trong quá trình tính toán với các số, có những lúc chúng ta sẽ gặp phải những lỗi như sau:
Đây là một lỗi rất cơ bản. Nguyên nhân của nó có thể được hiểu như sau: Để lưu trữ các số, máy tính sẽ chuyển các số này về dạng số nhị phân để tiến hành lưu trữ. Nhưng không phải số nào cũng có thể được biểu diễn một cách chính xác dưới dạng số nhị phân, và điều này tạo ra sai số (Giống các trường hợp trên).
Kết luận
Qua bài này, các bạn đã có kiến thức về kiểu dữ liệu số (Number) trong JavaScript
Cr: HKteam
Đăng nhận xét