Angka adalah tipe data paling sering kita pakai dalam program. Kotlin menyediakan enam tipe angka bawaan: Byte, Short, Int, Long, Float, dan Double. Setiap tipe memiliki rentang dan presisi berbeda, dan kompilator menyimpulkan tipe default dari literal. Selain tipe ini, terdapat pula tipe unsigned (UByte, UShort, UInt, ULong) yang akan kita bahas pada chapter tersendiri. Pada chapter ini kita akan melihat seluruh tipe angka beserta cara penulisan literalnya.

Enam tipe angka bawaan #

Tabel berikut merangkum keenam tipe angka Kotlin:

TipeUkuranRentang (signed)Presisi desimal
Byte8 bit-128 .. 127—
Short16 bit-32.768 .. 32.767—
Int32 bit-2^31 .. 2^31-1—
Long64 bit-2^63 .. 2^63-1—
Float32 bit±3.4E386-7 digit
Double64 bit±1.8E30815-16 digit

Pilihan tipe memengaruhi akurasi perhitungan dan konsumsi memori. Int adalah tipe default untuk bilangan bulat; Double untuk bilangan desimal.

Literal underscore #

Kotlin mendukung penulisan literal dengan underscore sebagai pemisah visual. Fitur ini membantu membaca angka besar tanpa memengaruhi nilai:

kotlin Literal underscore
val penduduk = 270_000_000           // 270 juta
val jarakBumiMatahari = 149_597_870_700L
val suhuTubuh = 36.6f
val pi = 3.141592653589793
val kodeBiner = 0b1010_0011_1110_0101
val kodeHex = 0xFF_AA_00

Underscore boleh diletakkan di mana pun antara digit, asalkan tidak di awal atau akhir literal.

Literal hex dan biner #

Kotlin mendukung tiga basis literal untuk bilangan bulat:

BasisAwalanContohTipe default
Desimal(tanpa)42Int
Heksadesimal0x0xFFInt
Biner0b0b1010Int

Untuk literal yang melampaui Int.MAX_VALUE, gunakan suffix L agar disimpulkan sebagai Long.

Demonstrasi tipe angka #

Berikut program yang memperlihatkan berbagai tipe angka beserta propertinya:

kotlin
fun main() {
    val byteMax: Byte = 127
    val shortJarak: Short = 32000
    val intPenduduk: Int = 270_000_000
    val longJarakBumi: Long = 149_597_870_700L
    val floatSuhu: Float = 36.6f
    val doublePi: Double = 3.141592653589793
    val uang = 1_500_000

    println("byteMax        = $byteMax")
    println("shortJarak     = $shortJarak")
    println("intPenduduk    = $intPenduduk")
    println("longJarakBumi  = $longJarakBumi")
    println("floatSuhu      = $floatSuhu")
    println("doublePi       = $doublePi")
    println("uang           = $uang")

    println()
    println("Ukuran bit (JVM):")
    println("Byte   : ${Byte.SIZE_BITS} bit  | range ${Byte.MIN_VALUE} .. ${Byte.MAX_VALUE}")
    println("Short  : ${Short.SIZE_BITS} bit  | range ${Short.MIN_VALUE} .. ${Short.MAX_VALUE}")
    println("Int    : ${Int.SIZE_BITS} bit | range ${Int.MIN_VALUE} .. ${Int.MAX_VALUE}")
    println("Long   : ${Long.SIZE_BITS} bit | range ${Long.MIN_VALUE} .. ${Long.MAX_VALUE}")
    println("Float  : ${Float.SIZE_BITS} bit")
    println("Double : ${Double.SIZE_BITS} bit")

    println()
    val idWarna = 0xFF_AA_00
    val binerMask = 0b1010_0011_1110_0101
    val panjangHex = 0xDE_AD_BE_EFL
    println("idWarna (hex Int)    = $idWarna")
    println("binerMask (biner)    = $binerMask")
    println("panjangHex (hex Long) = $panjangHex")
}

Output yang Dihasilkan:

text
byteMax        = 127
shortJarak     = 32000
intPenduduk    = 270000000
longJarakBumi  = 149597870700
floatSuhu      = 36.6
doublePi       = 3.141592653589793
uang           = 1500000

Ukuran bit (JVM):
Byte   : 8 bit  | range -128 .. 127
Short  : 16 bit  | range -32768 .. 32767
Int    : 32 bit | range -2147483648 .. 2147483647
Long   : 64 bit | range -9223372036854775808 .. 9223372036854775807
Float  : 32 bit
Double : 64 bit

idWarna (hex Int)    = 16755200
binerMask (biner)    = 41957
panjangHex (hex Long) = 3735928559

Mari kita amati baris-baris penting pada kode di atas:

  1. Baris 2-7 — deklarasi dengan tipe eksplisit. Byte cocok untuk nilai kecil agar hemat memori; Long wajib untuk angka besar di luar rentang Int.
  2. Baris 8 (val uang = 1_500_000) — uang disimpulkan sebagai Int karena berada dalam rentang Int dan tanpa suffix L.
  3. Baris 12-17 (Byte.SIZE_BITS, dst.) — setiap tipe angka memiliki properti SIZE_BITS, MIN_VALUE, dan MAX_VALUE yang membantu kita memeriksa rentang secara terprogram.
  4. Baris 20 (val idWarna = 0xFF_AA_00) — literal hex dengan underscore; karena nilainya (0xFFAA00 = 16.755.200) muat di Int, disimpulkan sebagai Int.
  5. Baris 21 (val binerMask = 0b1010_0011_1110_0101) — literal biner; disimpulkan sebagai Int.
  6. Baris 22 (val panjangHex = 0xDE_AD_BE_EFL) — nilai 0xDEADBEEF = 3.735.928.559 melampaui Int.MAX_VALUE, sehingga suffix L wajib untuk menjadikannya Long.

Suffix literal #

SuffixTipeContoh
LLong42L
fFloat36.6f
uUInt/ULong42u (lihat chapter unsigned)

Suffix L dan f bersifat case-sensitive terhadap huruf besar/kecil — 42L dan 42l sama-sama sah; 36.6f sah, 36.6F juga sah.

Pemilihan tipe angka #

KebutuhanTipe yang disarankan
Hitungan umum, indeks loopInt
Ukuran file, ID database besarLong
Bacaan sensor, koordinat kasatFloat (hemat memori)
Kalkulasi ilmiah, keuangan presisiDouble
Data biner (RGB, byte stream)Byte

Referensi Lanjutan #

  • Numbers — dokumentasi lengkap tipe angka Kotlin: Int, Long, Short, Byte, Double, dan Float

Pemahaman tentang tipe angka menjadi fondasi untuk membahas tipe integer dan floating-point secara mendalam. Berikutnya, kita akan membedah tipe integer secara khusus — range, overflow, dan varian unsigned — pada chapter Integer Types.