Tiga tipe data yang paling sering dipakai untuk perhitungan adalah int, float, dan bool. Nilai yang ditulis langsung di dalam kode disebut literal, misalnya 42 atau 3.14. Topik ini membahas penulisan literal untuk ketiganya, batas presisi float menurut standar IEEE 754, serta hubungan yang tidak terduga antara bool dan int. Pemahaman ini mencegah kebingungan klasik seperti hasil 0.1 + 0.2 yang ternyata tidak persis 0.3.
Tipe int dan literal numeriknya#
Tipe int menyimpan bilangan bulat dengan presisi tak terbatas. Batasnya bukan ukuran memori tetap sebagaimana pada banyak bahasa lain, melainkan memori yang tersedia. Angka raksasa sekalipun dihitung persis tanpa pembulatan, sehingga perhitungan seperti perpangkatan besar tetap dapat dipercaya.
print(10 ** 100)
print(type(10 ** 100))10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
<class 'int'>Hasil 10 pangkat 100 tampil utuh, seratus angka nol mengikuti angka satu, tanpa notasi khusus maupun kehilangan presisi. Tipe yang dilaporkan tetap int. Perilaku ini membedakan Python dari bahasa yang bilangan bulatnya melimpah atau bergulir pada batas tertentu.
Literal bilangan bulat ditulis dengan desimal secara bawaan. Untuk keterbacaan, digit boleh dipisah garis bawah. Tersedia pula prefiks 0b untuk biner, 0o untuk oktal, dan 0x untuk heksadesimal.
print(1_000_000)
print(0b1010, 0o17, 0xff)1000000
10 15 255Prefiks hanya menyangkut cara penulisan, keluarannya tetap nilai desimal yang setara: 0b1010 bernilai 10, 0o17 bernilai 15, dan 0xff bernilai 255. Garis bawah pada 1_000_000 tidak mengubah nilai apa pun dan murni berfungsi sebagai pembatas visual untuk angka yang panjang.
Tipe float dan presisi IEEE 754#
Tipe float menyimpan bilangan pecahan menurut standar IEEE 754 berpresisi ganda, representasi yang dipakai hampir semua bahasa pemrograman. Konsekuensinya, angka desimal seperti 0.1 tidak pernah tersimpan persis. Penyajian 0.1 dalam basis dua tidak berhingga, mirip seperti pecahan sepertiga yang tak hingga dalam basis sepuluh.
Sebelum membahas jebakannya, perhatikan satu perilaku pembagian berikut.
print(10 / 2, type(10 / 2))
print(10 * 2, type(10 * 2))5.0 <class 'float'>
20 <class 'int'>Operator pembagian / selalu menghasilkan float, bahkan ketika hasilnya bilangan bulat seperti 10 / 2 yang bernilai 5.0. Perkalian dua int tetap int. Perbedaan tipe ini perlu diperhatikan ketika hasilnya dipakai untuk perhitungan lanjutan.
Jebakan presisinya muncul pada perhitungan berikut.
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
import math
print(math.isclose(0.1 + 0.2, 0.3))
print(round(0.1 + 0.2, 2))0.30000000000000004
False
True
0.3Hasil penjumlahannya tampil sebagai 0.30000000000000004 dan perbandingan dengan == menghasilkan False. Hasil ini bukan bug Python, melainkan konsekuensi representasi IEEE 754 yang juga dijumpai pada C, Java, dan JavaScript. Fungsi math.isclose() menguji kedekatan dua nilai dengan toleransi bawaan yang cukup untuk perhitungan harian, sedangkan round() membulatkan nilainya untuk keperluan tampilan.
Boolean dan hubungannya dengan int#
Tipe bool hanya memuat dua nilai, True dan False, keduanya ditulis dengan huruf kapital di awal. Nilai bool biasanya lahir dari operator perbandingan. Yang tidak terduga bagi sebagian orang, bool adalah subclass dari int, sehingga True setara dengan 1 dan False setara dengan 0.
print(10 > 5, type(10 > 5))
print(issubclass(bool, int))
print(isinstance(True, int))
print(True + True)
print(True + False)
print(int(True), int(False))True <class 'bool'>
True
True
2
1
1 0Fungsi issubclass() memastikan bool mewarisi int, dan isinstance(True, int) ikut bernilai True. Akibatnya aritmetika biasa tetap berjalan pada bool: True + True menghasilkan 2. Sifat ini dipakai dalam pola penghitungan, misalnya menjumlahkan sekumpulan hasil perbandingan untuk mengetahui berapa banyak yang bernilai True.
Konversi antartipe#
Fungsi int() dan float() mengubah nilai antartipe numerik. Diberi string berisi angka, keduanya mengurai teksnya menjadi angka, pola yang kelak dipakai untuk mengubah masukan pengguna. Diberi nilai float, int() memotong bagian desimalnya, bukan membulatkan.
print(int(3.9))
print(int("42") + 8)
print(float("3.5"))3
50
3.5Hasil int(3.9) adalah 3 karena pemotongan menuju nol, sementara round() berfungsi membulatkan. Konversi yang gagal mengurai teks memicu ValueError, misalnya int(“tiga belas”), sehingga pastikan teks yang dikonversi memang berbentuk angka.
Ringkasan#
- int memiliki presisi tak terbatas, sedangkan float mengikuti standar IEEE 754 berpresisi ganda.
- Operator
/selalu menghasilkan float, dan literal bilangan mendukung garis bawah serta prefiks 0b, 0o, dan 0x. - 0.1 + 0.2 tidak persis 0.3 akibat pembulatan biner, sehingga perbandingan float memakai math.isclose() alih-alih
==. - bool adalah subclass int dengan True setara 1 dan False setara 0, dan int() memotong desimal alih-alih membulatkan.
Referensi#
- Floating Point Arithmetic: Issues and Limitations — Python Software Foundation — Penjelasan resmi mengapa 0.1 + 0.2 tidak sama dengan 0.3 beserta cara menanganinya.
- Built-in Types: Numeric Types — Python Software Foundation — Spesifikasi tipe numerik int, float, dan bool beserta operasi dan konversinya.
- math.isclose() — Python Software Foundation — Dokumentasi perbandingan bertoleransi untuk nilai pecahan.