Skip to Content
Kotlin📘 Ngôn ngữ Kotlin🔢 Kiểu dữ liệu Số

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ómKiểuVí dụ
Số nguyênByte, Short, Int, Long42, -100, 1000000L
Số thựcFloat, Double3.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ểuBitsMinMaxDùng khi
Byte8-128127Dữ liệu binary nhỏ
Short16-32,76832,767Hiếm dùng
Int32-2.1 tỷ2.1 tỷMặc định
Long64-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

Unsigned 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ểuBitsĐộ chính xácSuffixDùng khi
Float32~6-7 chữ sốfTiết kiệm bộ nhớ
Double64~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 BigDecimal hoặ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.3333333333333335

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

Tă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 Long nế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 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

Last updated on