1. Có những loại số nào?
Trong lập trình, chúng ta liên tục làm việc với các con số — từ tuổi của người dùng đến số lượng ngôi sao trong thiên hà hoặc số xu lẻ trong tài khoản ngân hàng. Nhưng những bài toán khác nhau cần những loại số khác nhau: đôi khi chỉ cần lưu số nguyên, đôi khi cần các phân số rất chính xác, và đôi khi cần các số “không âm”.
Số nguyên (int và các loại khác)
Số nguyên là số không có phần thập phân.
Trong Java, kiểu được dùng thường xuyên nhất là int, nhưng ngoài ra còn có một vài lựa chọn khác, khác nhau về kích thước và phạm vi.
- int — kiểu “làm việc” chính cho số nguyên. Nó chứa được các giá trị rất lớn (và rất nhỏ), mà lại không tốn quá nhiều bộ nhớ. Ví dụ, để đếm lượt thích, tuổi, số ngày trong năm thì gần như luôn dùng int.
- long — dùng khi giá trị có thể rất lớn (ví dụ, hàng tỷ hoặc nghìn tỷ). Ví dụ: lưu tổng số lượt xem YouTube trong toàn bộ lịch sử.
- short — tiết kiệm nhưng ít được dùng. Phù hợp ở nơi có nhiều giá trị nhỏ lặp lại (ví dụ, dữ liệu âm thanh, thành phần màu).
- byte — cho các giá trị nhỏ hơn nữa, đặc biệt trong đồ họa và làm việc với tệp, nơi việc tiết kiệm bộ nhớ là quan trọng.
Số thực (double, float)
Đôi khi cần làm việc với các con số có phần thập phân. Ví dụ, nhiệt độ không khí, điểm trung bình của sinh viên, giá hàng hóa có phần lẻ.
- double — kiểu “mặc định” để lưu số thực. Đủ chính xác cho đa số phép tính (ví dụ: 3.1415926535…).
- float — nhẹ hơn và kém chính xác hơn, thường gặp trong đồ họa máy tính hoặc xử lý mảng dữ liệu lớn, nơi cần tiết kiệm bộ nhớ.
Các kiểu số đặc biệt
- BigInteger — khi cần làm việc với các số khổng lồ vượt quá phạm vi chuẩn, ví dụ trong mật mã hoặc tính toán thiên văn.
- BigDecimal — lớp dành cho tính toán chính xác với số thực (tài chính, tính lãi), giúp tránh các sai số vốn có của double và float.
2. Phạm vi giá trị
Các kiểu số nguyên có thể lưu cả số dương lẫn số âm. Điều này tiện khi giá trị có thể “trên hoặc dưới không”: ví dụ, nhiệt độ, số dư tài khoản, độ cao so với mực nước biển.
Ví dụ:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
Kiểu số nguyên
| Kiểu | Kích thước | Phạm vi giá trị | Ví dụ sử dụng |
|---|---|---|---|
|
1 byte | -128 đến 127 | -128, 0, 127 |
|
2 byte | -32 768 đến 32 767 | -1000, 0, 32000 |
|
4 byte | -2 147 483 648 đến 2 147 483 647 | -1000000, 0, 2000000 |
|
8 byte | -9 223 372 036 854 775 808 đến 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
Kiểu số thực
| Kiểu | Kích thước | Ví dụ giá trị | Mô tả |
|---|---|---|---|
|
4 byte | 3.14f, -0.001f | độ chính xác đơn (7 chữ số) |
|
8 byte | 3.1415, -1.7E+308 | độ chính xác kép (15–16 chữ số) |
3. Hậu tố cho số
Trong một số tình huống, bạn cần chỉ rõ kiểu muốn dùng cho một số. Việc này được thực hiện bằng các hậu tố:
- L hoặc l — cho kiểu long (ví dụ, 10000000000L)
- F hoặc f — cho kiểu float (ví dụ, 3.14f)
- D hoặc d — cho kiểu double (thường không cần, vì số thực không có hậu tố mặc định là double)
Nếu không chỉ định hậu tố, mặc định số nguyên được coi là int, còn số thực là double. Ví dụ, 42 là int, còn 3.14 là double.
Tại sao cần điều này? Ví dụ để không gặp lỗi khi gán một số lớn cho biến kiểu long:
long bigNumber = 9000000000L; // nếu bỏ L, sẽ có lỗi biên dịch
Dấu phân tách bằng dấu gạch dưới _
Khi các số quá dài, rất dễ nhầm lẫn các số 0. Để dễ nhìn và dễ đọc, trong Java bạn có thể dùng dấu gạch dưới bên trong số.
int population = 146_700_000;
long stars = 100_000_000_000L;
Điều này hoàn toàn hợp lệ: trình biên dịch sẽ bỏ qua dấu gạch dưới, còn bạn thì dễ nhìn thấy các nhóm chữ số ngay “bằng mắt”. Lưu ý — không đặt dấu gạch dưới ở đầu, cuối, ngay sau dấu chấm thập phân hoặc trước hậu tố.
4. Kiểu ký tự char: là gì và để làm gì?
Kiểu char dùng để lưu một ký tự: chữ cái, chữ số, dấu câu, khoảng trắng, ký tự đặc biệt và thậm chí cả biểu tượng cảm xúc.
Ví dụ:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // Vâng, cũng có thể như vậy!
Các quy tắc quan trọng:
- Giá trị kiểu char được viết trong dấu nháy đơn: 'A', '7', '#'.
- Đó chính xác là một ký tự! Nếu viết 'AB' — trình biên dịch sẽ báo lỗi.
- Đằng sau mỗi ký tự là một mã số riêng (Unicode).
Unicode: ký tự từ khắp thế giới
Java sử dụng tiêu chuẩn Unicode, cho phép lưu không chỉ chữ cái Latin mà còn cả chữ Cyrillic, chữ tượng hình, emoji và thậm chí cả chữ tượng hình Ai Cập cổ (nếu cần).
Thông tin thú vị:
Kiểu char về bản chất là một số 16-bit (từ 0 đến 65535), trong đó mỗi giá trị tương ứng với một ký tự.
5. Ký tự và số: liên hệ qua Unicode
Vì mỗi ký tự thực chất là một con số, ta có thể chuyển đổi char sang int và ngược lại một cách dễ dàng.
Ví dụ: lấy mã Unicode của ký tự
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // Chuyển đổi ngầm định char → int
System.out.println("Mã của ký tự '" + ch + "': " + code);
}
}
Kết quả:
Mã của ký tự 'A': 65
Và bây giờ ngược lại — lấy ký tự theo mã:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // Mã của chữ 'A' trong Unicode (Cyrillic)
char ch = (char) code; // Chuyển đổi tường minh int → char
System.out.println("Ký tự có mã " + code + ": " + ch);
}
}
Kết quả:
Ký tự có mã 1040: \u0410
6. Các kiểu nguyên thủy cơ bản của Java
| Kiểu | Kích thước (bit) | Phạm vi giá trị | Ví dụ giá trị | Ghi chú |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | Rất hiếm khi dùng |
|
16 | -32,768 ... 32,767 | 12345 | Để tiết kiệm bộ nhớ |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | Kiểu chính cho số nguyên |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | Cho số nguyên rất lớn |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | Số thực, độ chính xác thấp |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | Số thực, độ chính xác cao |
|
16 | 0 ... 65 535 (Unicode) | '\u0416', 'A', '?' | Một ký tự |
|
1 | true, false | true | Giá trị logic |
GO TO FULL VERSION