Kiểu dữ liệu Số trong Kotlin
🎯 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ố
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)
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 = 100
val short: Short = 30000
val int = 2_000_000_000 // Int mặc định
val long = 9_000_000_000_000_000L // Thêm L suffixUnsigned integers (Kotlin 1.5+)
val uByte: UByte = 255u // 0 đến 255
val uShort: UShort = 65535u // 0 đến 65,535
val 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)
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 f
val double = 3.14159265359 // Double - mặc định
// Cẩn thận với độ chính xác!
val result = 0.1f + 0.2f
println(result) // 0.30000001 (không chính xác!)
val better = 0.1 + 0.2
println(better) // 0.30000000000000004 (vẫn có sai số nhỏ)[!WARNING] Không dùng Float/Double cho tiền tệ! Sử dụng
BigDecimalhoặc lưu dạng cents (Int).
🔢 Các phép toán số học
Operators cơ bản
val a = 10
val b = 3
println(a + b) // 13 - Cộng
println(a - b) // 7 - Trừ
println(a * b) // 30 - Nhân
println(a / b) // 3 - Chia (số nguyên!)
println(a % b) // 1 - Chia lấy dư
// Chia số thực
val c = 10.0
val d = 3.0
println(c / d) // 3.3333333333333335Toá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 → 2Tăng/Giảm
var count = 0
count++ // count = 1
count-- // count = 0
// Prefix vs Postfix
var a = 5
println(a++) // In 5, rồi tăng a thành 6
println(++a) // Tăng a thành 7, rồi in 7🔍 Math functions
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
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
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
1. Overflow (Tràn số)
val maxInt = Int.MAX_VALUE // 2147483647
val overflow = maxInt + 1 // -2147483648 (không có exception!)
println(overflow) // ⚠️ Kết quả sai![!CAUTION] Kotlin không throw exception khi overflow. Sử dụng
Longnếu cần số lớn hơn.
2. Division by zero
// Số nguyên: throw ArithmeticException
val intResult = 10 / 0 // ❌ ArithmeticException
// Số thực: trả về Infinity
val doubleResult = 10.0 / 0.0 // Infinity
val negResult = -10.0 / 0.0 // -Infinity
val nanResult = 0.0 / 0.0 // NaN (Not a Number)3. Kiểm tra NaN và Infinity
val result = 0.0 / 0.0
println(result.isNaN()) // true
println(result.isInfinite()) // false
println(result.isFinite()) // false🛠️ 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
// Tính toán kích thước UI
val density = resources.displayMetrics.density
val dpValue = 16
val pxValue = (dpValue * density).roundToInt()
// Tính phần trăm download
val downloaded = 750L
val total = 1000L
val percentage = (downloaded.toDouble() / total * 100).toInt()
progressBar.progress = percentage
// Format tiền tệ
val price = 15_000_000
val formatted = NumberFormat.getCurrencyInstance(Locale("vi", "VN"))
.format(price)
// Output: 15.000.000 ₫✅ 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
Last updated on