Bỏ qua để đến nội dung

🔢 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.


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)

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 suffix
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

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ỏ)

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.3333333333333335
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
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

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
}
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
}

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, ...]
}

val maxInt = Int.MAX_VALUE // 2147483647
val overflow = maxInt + 1 // -2147483648 (không có exception!)
println(overflow) // ⚠️ Kết quả sai!
// 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)
val result = 0.0 / 0.0
println(result.isNaN()) // true
println(result.isInfinite()) // false
println(result.isFinite()) // false

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!")
}
}

// 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 ₫

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 Lf
  • Hiểu vấn đề overflow và cách tránh
  • Sử dụng kotlin.math cho các hàm toán học
  • Tạo số ngẫu nhiên với Random.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