Các Toán tử Số học trong Kotlin
🎯 Mục tiêu: Nắm vững các phép toán số học cơ bản và nâng cao trong Kotlin.
💡 Tổng quan toán tử
| Toán tử | Tên | Ví dụ | Kết quả |
|---|---|---|---|
+ | Cộng | 5 + 3 | 8 |
- | Trừ | 5 - 3 | 2 |
* | Nhân | 5 * 3 | 15 |
/ | Chia | 5 / 3 | 1 (Int) |
% | Chia lấy dư | 5 % 3 | 2 |
val a = 10
val b = 3
println(a + b) // 13
println(a - b) // 7
println(a * b) // 30
println(a / b) // 3 (chia số nguyên)
println(a % b) // 1📝 Phép chia - Cẩn thận!
Chia số nguyên vs số thực
// Số nguyên / Số nguyên = Số nguyên (bỏ phần thập phân)
println(7 / 2) // 3 (không phải 3.5!)
// Có ít nhất 1 số thực = Số thực
println(7.0 / 2) // 3.5
println(7 / 2.0) // 3.5
println(7.0 / 2.0) // 3.5
// Convert để có kết quả chính xác
val a = 7
val b = 2
println(a.toDouble() / b) // 3.5Chia cho 0
// Số nguyên chia 0 = Exception
// val error = 10 / 0 // ❌ ArithmeticException
// Số thực chia 0 = Infinity hoặc NaN
println(10.0 / 0.0) // Infinity
println(-10.0 / 0.0) // -Infinity
println(0.0 / 0.0) // NaN📊 Toán tử gán kết hợp
var x = 10
x += 5 // x = x + 5 → 15
x -= 3 // x = x - 3 → 12
x *= 2 // x = x * 2 → 24
x /= 4 // x = x / 4 → 6
x %= 4 // x = x % 4 → 2
println(x) // 2⬆️ Toán tử tăng/giảm
Prefix vs Postfix
var a = 5
var b = 5
// Postfix (a++) - trả về giá trị CŨ, rồi tăng
println(a++) // In 5, sau đó a = 6
// Prefix (++b) - tăng trước, rồi trả về giá trị MỚI
println(++b) // Tăng thành 6, in 6Trong biểu thức
var count = 0
// Postfix
val result1 = count++ * 2 // result1 = 0, count = 1
// Prefix
val result2 = ++count * 2 // count = 2, result2 = 4🔢 Phép toán với kiểu dữ liệu khác nhau
Type promotion
val intVal = 10
val longVal = 20L
val doubleVal = 3.14
// Int + Long = Long
val result1 = intVal + longVal // Long: 30
// Int + Double = Double
val result2 = intVal + doubleVal // Double: 13.14
// Với Byte, Short cần convert
val byte: Byte = 10
val short: Short = 20
val sum = byte + short // Int (không phải Byte hay Short)🧮 Các hàm toán học (kotlin.math)
import kotlin.math.*
fun main() {
// Lũy thừa
println(2.0.pow(10)) // 1024.0
// Căn bậc hai
println(sqrt(16.0)) // 4.0
// Giá trị tuyệt đối
println(abs(-5)) // 5
// Làm tròn
println(round(3.7)) // 4.0
println(floor(3.7)) // 3.0 (xuống)
println(ceil(3.2)) // 4.0 (lên)
// Min, Max
println(max(10, 20)) // 20
println(min(10, 20)) // 10
// Hằng số
println(PI) // 3.141592653589793
println(E) // 2.718281828459045
}⚡ Kotlin Extensions hữu ích
fun main() {
// coerceIn - giới hạn giá trị
val score = 150
val validScore = score.coerceIn(0, 100)
println(validScore) // 100
// coerceAtLeast / coerceAtMost
val age = -5
println(age.coerceAtLeast(0)) // 0
val quantity = 15
println(quantity.coerceAtMost(10)) // 10
// Ranges
println(5 in 1..10) // true
println(15 in 1..10) // false
}🎲 Thứ tự ưu tiên toán tử
Từ cao đến thấp:
()- Dấu ngoặc++,--- Tăng/giảm*,/,%- Nhân, chia+,-- Cộng, trừ+=,-=, etc. - Gán kết hợp
val result = 2 + 3 * 4 // 14 (không phải 20)
val result2 = (2 + 3) * 4 // 20🛠️ Thực hành
Bài tập 1: Tính tiền taxi
fun main() {
val baseFare = 15000 // Giá mở cửa
val pricePerKm = 5000 // Giá mỗi km
val distance = 7.5 // Quãng đường (km)
// TODO: Tính tổng tiền
}Lời giải:
fun main() {
val baseFare = 15000
val pricePerKm = 5000
val distance = 7.5
val total = baseFare + (pricePerKm * distance)
println("Tổng tiền: ${"%,.0f".format(total)} VNĐ")
// Output: Tổng tiền: 52,500 VNĐ
}Bài tập 2: Đổi giây thành giờ:phút:giây
fun main() {
val totalSeconds = 3725 // Tổng số giây
// TODO: Tính giờ, phút, giây
// TODO: In ra dạng "1:02:05"
}Lời giải:
fun main() {
val totalSeconds = 3725
val hours = totalSeconds / 3600
val minutes = (totalSeconds % 3600) / 60
val seconds = totalSeconds % 60
println("$hours:${"%02d".format(minutes)}:${"%02d".format(seconds)}")
// Output: 1:02:05
}Bài tập 3: Tính lãi suất kép
fun main() {
val principal = 10_000_000.0 // Vốn gốc
val rate = 0.08 // Lãi suất 8%/năm
val years = 5 // Số năm
// TODO: Tính tổng tiền sau n năm
// Công thức: A = P * (1 + r)^n
}Lời giải:
import kotlin.math.pow
fun main() {
val principal = 10_000_000.0
val rate = 0.08
val years = 5
val amount = principal * (1 + rate).pow(years)
val interest = amount - principal
println("Vốn gốc: ${"%,.0f".format(principal)} VNĐ")
println("Tổng sau $years năm: ${"%,.0f".format(amount)} VNĐ")
println("Lãi: ${"%,.0f".format(interest)} VNĐ")
}Output:
Vốn gốc: 10,000,000 VNĐ
Tổng sau 5 năm: 14,693,281 VNĐ
Lãi: 4,693,281 VNĐ📱 Trong Android
// Tính kích thước
val widthDp = 200
val density = resources.displayMetrics.density
val widthPx = (widthDp * density).toInt()
// Tính phần trăm
val downloaded = 750
val total = 1000
val percent = (downloaded * 100) / total
progressBar.progress = percent
// Animation duration
val baseDuration = 300
val distance = 500
val adjustedDuration = baseDuration + (distance / 10)⚠️ Lưu ý quan trọng
[!WARNING] Integer overflow không báo lỗi:
val max = Int.MAX_VALUE // 2147483647 println(max + 1) // -2147483648 (overflow!)
[!TIP] Để tính toán chính xác với tiền tệ:
import java.math.BigDecimal val price = BigDecimal("19.99") val quantity = BigDecimal("3") val total = price * quantity // 59.97 (chính xác)
✅ Checklist - Tự kiểm tra
Sau bài học này, bạn có thể:
- Sử dụng 5 toán tử cơ bản:
+,-,*,/,% - Hiểu sự khác biệt giữa chia số nguyên và số thực
- Sử dụng toán tử gán kết hợp:
+=,-=,*=,/= - Phân biệt prefix (
++x) và postfix (x++) - Sử dụng các hàm từ
kotlin.math - Áp dụng
coerceIn()để giới hạn giá trị
Tiếp theo: Toán tử quan hệ/so sánh
Last updated on