Angka adalah bahan baku hampir semua program: harga, stok, persentase diskon, hingga koordinat. Python menyediakan tiga tipe data numerik bawaan — int, float, dan complex — dengan dua perilaku yang sering mengejutkan pemula: int tidak pernah overflow, sementara float membawa sifat presisi dari standar IEEE 754. Pada Chapter ini kita akan membedah ketiganya beserta kebiasaan penulisannya.

int dengan Presisi Tak Terbatas #

Tipe int menyimpan bilangan bulat dengan ukuran sebatas memori yang tersedia — tidak ada batas 32 bit atau 64 bit seperti di bahasa C atau Java. Interpreter Python menyimpan digit int pada struktur yang panjangnya menyesuaikan kebutuhan, sehingga bilangan besar tetap dihitung dengan tepat:

python
print(2 ** 100)

Output yang Dihasilkan:

text
1267650600228229401496703205376

Pada bahasa dengan int berukuran tetap, operasi 2 ** 100 akan overflow dan menghasilkan nilai salah. Di Python, hasil 31 digit tersebut dihitung apa adanya. Berkat desain ini, Python 3 tidak lagi membedakan int dan long seperti pada Python 2; semuanya sudah menjadi satu tipe int.

float dan Standar IEEE 754 #

Tipe float menyimpan bilangan pecahan mengikuti standar IEEE 754 double precision (64 bit) yang juga dipakai hampir semua bahasa pemrograman modern. Standar ini merepresentasikan angka dalam bentuk pecahan biner, dan di sinilah letak jebakannya: banyak bilangan desimal tidak bisa direpresentasikan secara persis dalam biner, mirip seperti 1/3 yang tidak bisa ditulis persis dalam desimal.

Perhatikan hasil berikut — ini bukan bug, melainkan konsekuensi langsung dari representasi biner:

python
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
print(round(0.1 + 0.2, 1))

Output yang Dihasilkan:

text
0.30000000000000004
False
0.3

Interpreter Python menjumlahkan 0.1 dan 0.2 dalam representasi biner yang sedikit meleset dari 0.3 yang sebenarnya, sehingga hasilnya 0.30000000000000004 dan perbandingan == 0.3 menghasilkan False.

complex untuk Bilangan Kompleks #

Python menuliskan bilangan kompleks dengan akhiran j pada bagian imajiner — huruf i tidak dipakai karena i adalah nama identifier yang sah. Tipe complex sering dipakai di bidang rekayasa dan pemrosesan sinyal:

python
z = 3 + 4j
print(z)
print(z.real, z.imag)
print(abs(z))

Output yang Dihasilkan:

text
(3+4j)
3.0 4.0
5.0

Object complex menyimpan dua atribut: real untuk bagian real dan imag untuk bagian imajiner, keduanya bertipe float. Fungsi abs() menghitung besar (magnitudo) bilangan kompleks tersebut, yaitu akar dari 3² + 4² = 5.0.

Underscore pada Numeric Literal #

Angka panjang sulit dibaca. Sejak Python 3.6, kita boleh menyisipkan garis bawah pada numeric literal sebagai pemisah ribuan; interpreter mengabaikannya sepenuhnya:

python
penduduk = 277_000_000
modal = 1_500_000.50
print(penduduk)
print(modal)

Output yang Dihasilkan:

text
277000000
1500000.5

Penulisan 277_000_000 jauh lebih mudah diperiksa mata dibanding 277000000, dan nilainya tetap identik. Garis bawah boleh disisipkan pada literal int, float, maupun complex, serta pada bentuk heksadesimal dan biner.

Constructor int() dan float() #

Selain menulis literal secara langsung, kita bisa membuat nilai numerik lewat constructor int() dan float(). Constructor ini menerima string maupun nilai bertipe lain:

python
print(int("42"))
print(int(9.99))
print(int(-9.99))
print(float("3.14"))
print(float(7))

Output yang Dihasilkan:

text
42
9
-9
3.14
7.0

Dua perilaku penting terlihat di atas. Pertama, int("42") mengubah string menjadi angka — pola yang akan sering kita pakai saat membaca input pengguna. Kedua, int() memotong bagian pecahan ke arah nol: 9.99 menjadi 9 dan -9.99 menjadi -9 (bukan pembulatan ke bawah). Konversi semacam ini, termasuk galat yang muncul ketika string tidak bisa diubah, akan kita bahas tuntas pada Chapter Type Conversion.