Angka dan boolean

Tipe int, float, dan bool beserta literal numerik dan jebakan presisi IEEE 754.

Daftar isi

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.

python
print(10 ** 100)
print(type(10 ** 100))
text Keluaran
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.

python
print(1_000_000)
print(0b1010, 0o17, 0xff)
text Keluaran
1000000
10 15 255

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

python
print(10 / 2, type(10 / 2))
print(10 * 2, type(10 * 2))
text Keluaran
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.

python
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))
text Keluaran
0.30000000000000004
False
True
0.3

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

python
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))
text Keluaran
True <class 'bool'>
True
True
2
1
1 0

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

python
print(int(3.9))
print(int("42") + 8)
print(float("3.5"))
text Keluaran
3
50
3.5

Hasil 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#