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:
| Tipe | Ukuran | Rentang (signed) | Presisi desimal |
|---|---|---|---|
Byte | 8 bit | -128 .. 127 | — |
Short | 16 bit | -32.768 .. 32.767 | — |
Int | 32 bit | -2^31 .. 2^31-1 | — |
Long | 64 bit | -2^63 .. 2^63-1 | — |
Float | 32 bit | ±3.4E38 | 6-7 digit |
Double | 64 bit | ±1.8E308 | 15-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:
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_00Underscore 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:
| Basis | Awalan | Contoh | Tipe default |
|---|---|---|---|
| Desimal | (tanpa) | 42 | Int |
| Heksadesimal | 0x | 0xFF | Int |
| Biner | 0b | 0b1010 | Int |
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:
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:
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) = 3735928559Mari kita amati baris-baris penting pada kode di atas:
- Baris 2-7 — deklarasi dengan tipe eksplisit.
Bytecocok untuk nilai kecil agar hemat memori;Longwajib untuk angka besar di luar rentangInt. - Baris 8 (
val uang = 1_500_000) —uangdisimpulkan sebagaiIntkarena berada dalam rentangIntdan tanpa suffixL. - Baris 12-17 (
Byte.SIZE_BITS, dst.) — setiap tipe angka memiliki propertiSIZE_BITS,MIN_VALUE, danMAX_VALUEyang membantu kita memeriksa rentang secara terprogram. - Baris 20 (
val idWarna = 0xFF_AA_00) — literal hex dengan underscore; karena nilainya (0xFFAA00 = 16.755.200) muat diInt, disimpulkan sebagaiInt. - Baris 21 (
val binerMask = 0b1010_0011_1110_0101) — literal biner; disimpulkan sebagaiInt. - Baris 22 (
val panjangHex = 0xDE_AD_BE_EFL) — nilai0xDEADBEEF = 3.735.928.559melampauiInt.MAX_VALUE, sehingga suffixLwajib untuk menjadikannyaLong.
Suffix literal #
| Suffix | Tipe | Contoh |
|---|---|---|
L | Long | 42L |
f | Float | 36.6f |
u | UInt/ULong | 42u (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 #
| Kebutuhan | Tipe yang disarankan |
|---|---|
| Hitungan umum, indeks loop | Int |
| Ukuran file, ID database besar | Long |
| Bacaan sensor, koordinat kasat | Float (hemat memori) |
| Kalkulasi ilmiah, keuangan presisi | Double |
| Data biner (RGB, byte stream) | Byte |
Referensi Lanjutan #
- Numbers
— dokumentasi lengkap tipe angka Kotlin:
Int,Long,Short,Byte,Double, danFloat
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.