🔢 Kiểu dữ liệu Số
🎯 Mục tiêu: Nắm vững các kiểu số trong Kotlin, khi nào dùng kiểu nào, và các phép toán phổ biến.
💡 Tổng quan kiểu số
Phần tiêu đề “💡 Tổng quan kiểu số”Kotlin chia số thành 2 nhóm chính:
| Nhóm | Kiểu | Ví dụ |
|---|---|---|
| Số nguyên | Byte, Short, Int, Long |
42, -100, 1000000L |
| Số thực | Float, Double |
3.14f, 2.71828 |
val integer = 42 // Int (mặc định)val decimal = 3.14 // Double (mặc định)📝 Số nguyên (Integer Types)
Phần tiêu đề “📝 Số nguyên (Integer Types)”Chi tiết các kiểu
Phần tiêu đề “Chi tiết các kiểu”| Kiểu | Bits | Min | Max | Dùng khi |
|---|---|---|---|---|
Byte |
8 | -128 | 127 | Dữ liệu binary nhỏ |
Short |
16 | -32,768 | 32,767 | Hiếm dùng |
Int |
32 | -2.1 tỷ | 2.1 tỷ | Mặc định |
Long |
64 | -9.2×10¹⁸ | 9.2×10¹⁸ | Số rất lớn, timestamp |
val byte: Byte = 100val short: Short = 30000val int = 2_000_000_000 // Int mặc địnhval long = 9_000_000_000_000_000L // Thêm L suffixUnsigned integers (Kotlin 1.5+)
Phần tiêu đề “Unsigned integers (Kotlin 1.5+)”val uByte: UByte = 255u // 0 đến 255val uShort: UShort = 65535u // 0 đến 65,535val uInt: UInt = 4_294_967_295u // 0 đến ~4.3 tỷval uLong: ULong = 18_446_744_073_709_551_615uL📐 Số thực (Floating-Point Types)
Phần tiêu đề “📐 Số thực (Floating-Point Types)”Float vs Double
Phần tiêu đề “Float vs Double”| Kiểu | Bits | Độ chính xác | Suffix | Dùng khi |
|---|---|---|---|---|
Float |
32 | ~6-7 chữ số | f |
Tiết kiệm bộ nhớ |
Double |
64 | ~15-16 chữ số | (mặc định) | Mặc định, cần độ chính xác |
val float = 3.14f // Float - cần suffix fval double = 3.14159265359 // Double - mặc định
// Cẩn thận với độ chính xác!val result = 0.1f + 0.2fprintln(result) // 0.30000001 (không chính xác!)
val better = 0.1 + 0.2println(better) // 0.30000000000000004 (vẫn có sai số nhỏ)🔢 Các phép toán số học
Phần tiêu đề “🔢 Các phép toán số học”Operators cơ bản
Phần tiêu đề “Operators cơ bản”val a = 10val b = 3
println(a + b) // 13 - Cộngprintln(a - b) // 7 - Trừprintln(a * b) // 30 - Nhânprintln(a / b) // 3 - Chia (số nguyên!)println(a % b) // 1 - Chia lấy dư
// Chia số thựcval c = 10.0val d = 3.0println(c / d) // 3.3333333333333335Toán tử gán kết hợp
Phần tiêu đề “Toán tử gán kết hợp”var x = 10x += 5 // x = x + 5 → 15x -= 3 // x = x - 3 → 12x *= 2 // x = x * 2 → 24x /= 4 // x = x / 4 → 6x %= 4 // x = x % 4 → 2Tăng/Giảm
Phần tiêu đề “Tăng/Giảm”var count = 0count++ // count = 1count-- // count = 0
// Prefix vs Postfixvar a = 5println(a++) // In 5, rồi tăng a thành 6println(++a) // Tăng a thành 7, rồi in 7🔍 Math functions
Phần tiêu đề “🔍 Math functions”Package kotlin.math
Phần tiêu đề “Package kotlin.math”import kotlin.math.*
fun main() { // Làm tròn println(round(3.7)) // 4.0 println(floor(3.7)) // 3.0 (làm tròn xuống) println(ceil(3.2)) // 4.0 (làm tròn lên)
// Giá trị tuyệt đối println(abs(-5)) // 5
// Min/Max println(max(10, 20)) // 20 println(min(10, 20)) // 10
// Lũy thừa và căn println(sqrt(16.0)) // 4.0 println(2.0.pow(10)) // 1024.0
// Hằng số println(PI) // 3.141592653589793 println(E) // 2.718281828459045}Kotlin stdlib
Phần tiêu đề “Kotlin stdlib”fun main() { // coerceIn - giới hạn trong khoảng val score = 150 val validScore = score.coerceIn(0, 100) println(validScore) // 100
// coerceAtLeast / coerceAtMost val age = -5 val validAge = age.coerceAtLeast(0) println(validAge) // 0}🎲 Random numbers
Phần tiêu đề “🎲 Random numbers”import kotlin.random.Random
fun main() { // Số nguyên ngẫu nhiên val randomInt = Random.nextInt() // Bất kỳ Int val inRange = Random.nextInt(1, 100) // 1 đến 99
// Số thực ngẫu nhiên val randomDouble = Random.nextDouble() // 0.0 đến 1.0
// Sử dụng IntRange val dice = (1..6).random() // 1 đến 6
// Shuffle list val numbers = (1..10).shuffled() println(numbers) // [7, 3, 1, 9, ...]}⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”1. Overflow (Tràn số)
Phần tiêu đề “1. Overflow (Tràn số)”val maxInt = Int.MAX_VALUE // 2147483647val overflow = maxInt + 1 // -2147483648 (không có exception!)
println(overflow) // ⚠️ Kết quả sai!2. Division by zero
Phần tiêu đề “2. Division by zero”// Số nguyên: throw ArithmeticExceptionval intResult = 10 / 0 // ❌ ArithmeticException
// Số thực: trả về Infinityval doubleResult = 10.0 / 0.0 // Infinityval negResult = -10.0 / 0.0 // -Infinityval nanResult = 0.0 / 0.0 // NaN (Not a Number)3. Kiểm tra NaN và Infinity
Phần tiêu đề “3. Kiểm tra NaN và Infinity”val result = 0.0 / 0.0
println(result.isNaN()) // trueprintln(result.isInfinite()) // falseprintln(result.isFinite()) // false🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập 1: Tính diện tích và chu vi hình tròn
import kotlin.math.PI
fun main() { val radius = 5.0
// TODO: Tính diện tích (πr²) và chu vi (2πr)}Lời giải:
import kotlin.math.PI
fun main() { val radius = 5.0
val area = PI * radius * radius val circumference = 2 * PI * radius
println("Bán kính: $radius") println("Diện tích: ${"%.2f".format(area)}") println("Chu vi: ${"%.2f".format(circumference)}")}Bài tập 2: Đổi tiền
fun main() { val totalCents = 1567 // 1567 cents = $15.67
// TODO: Tách thành dollars và cents // TODO: In ra format "15 dollars and 67 cents"}Lời giải:
fun main() { val totalCents = 1567
val dollars = totalCents / 100 val cents = totalCents % 100
println("$dollars dollars and $cents cents") // Output: 15 dollars and 67 cents}Bài tập 3: Game xúc xắc
import kotlin.random.Random
fun main() { // TODO: Giả lập tung 2 xúc xắc // TODO: In kết quả và tổng điểm // TODO: Nếu tổng = 7 hoặc 11, in "Bạn thắng!"}Lời giải:
import kotlin.random.Random
fun main() { val dice1 = (1..6).random() val dice2 = (1..6).random() val total = dice1 + dice2
println("🎲 Xúc xắc 1: $dice1") println("🎲 Xúc xắc 2: $dice2") println("📊 Tổng: $total")
if (total == 7 || total == 11) { println("🎉 Bạn thắng!") }}📱 Trong Android
Phần tiêu đề “📱 Trong Android”// Tính toán kích thước UIval density = resources.displayMetrics.densityval dpValue = 16val pxValue = (dpValue * density).roundToInt()
// Tính phần trăm downloadval downloaded = 750Lval total = 1000Lval percentage = (downloaded.toDouble() / total * 100).toInt()progressBar.progress = percentage
// Format tiền tệval price = 15_000_000val formatted = NumberFormat.getCurrencyInstance(Locale("vi", "VN")) .format(price)// Output: 15.000.000 ₫✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ Checklist - Tự kiểm tra”Sau bài học này, bạn có thể:
- Phân biệt
Int,Long,Float,Double - Biết khi nào dùng suffix
Lvàf - Hiểu vấn đề overflow và cách tránh
- Sử dụng
kotlin.mathcho các hàm toán học - Tạo số ngẫu nhiên với
Randomvà.random() - Làm tròn số với
round(),floor(),ceil() - Giới hạn giá trị với
coerceIn()
Tiếp theo: Kiểu dữ liệu Chuỗi