Hampir setiap program perlu menghitung sesuatu: total belanja, sisa kuota, konversi satuan waktu, atau pajak transaksi. Operator aritmatika adalah alat Python untuk mengolah angka tersebut menjadi nilai baru. Pada Chapter ini kita akan membedah seluruh operator aritmatika beserta jebakan yang paling sering mengejutkan pemula, terutama perbedaan antara / dan // pada bilangan negatif.

Daftar Operator Aritmatika #

Python menyediakan tujuh operator aritmatika yang bekerja pada tipe int dan float:

OperatorNamaContohHasil
+Penjumlahan7 + 310
-Pengurangan7 - 34
*Perkalian7 * 321
/True division7 / 32.3333333333333335
//Floor division7 // 32
%Modulo (sisa bagi)7 % 31
**Pangkat7 ** 3343

Mari kita lihat operator tersebut bekerja dalam sebuah perhitungan transaksi:

python
harga_satuan = 17500
jumlah = 3

total = harga_satuan * jumlah
pajak = total * 11 / 100

print("Total:", total)
print("Pajak:", pajak)

Output yang Dihasilkan:

text
Total: 52500
Pajak: 5775.0

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 1 (harga_satuan = 17500): variabel harga_satuan dibuat dan menyimpan harga satu barang dalam rupiah.
  2. Baris 2 (jumlah = 3): variabel jumlah menyimpan banyaknya barang yang dibeli.
  3. Baris 4 (total = harga_satuan * jumlah): interpreter Python membaca nilai kedua variabel, mengalikannya menjadi 52500, lalu mengikat hasil tersebut ke variabel total.
  4. Baris 5 (pajak = total * 11 / 100): perkalian dan pembagian memiliki prioritas setara sehingga dievaluasi dari kiri ke kanan. Operator / selalu menghasilkan float, itulah sebabnya pajak bernilai 5775.0, bukan 5775.
  5. Baris 7-8 (print(...)): fungsi print() mencetak nilai total dan pajak ke terminal.

Operator + dan * juga dapat dipakai pada string, misalnya "ab" * 3 menghasilkan 'ababab'. Pembahasan lengkapnya kita simpan untuk Chapter Membuat dan Menggabungkan String.

True Division vs Floor Division #

Operator / (true division) selalu menghasilkan float dengan hasil pembagian yang sesungguhnya, sedangkan // (floor division) membulatkan hasil ke bawah menjadi bilangan bulat terdekat:

python
>>> 17 / 5
3.4
>>> type(17 / 5)
<class 'float'>
>>> 17 // 5
3
>>> type(17 // 5)
<class 'int'>

Perbedaan keduanya menjadi penting pada bilangan negatif. Floor division membulatkan ke bawah menuju negatif tak hingga, bukan ke arah nol:

python
>>> -17 // 5
-4
>>> 17 // -5
-4

Nilai -17 / 5 sesungguhnya adalah -3.4. Pembulatan ke bawah dari -3.4 adalah -4, bukan -3 seperti yang dipakai banyak bahasa pemrograman lain. Aturan “selalu ke bawah” ini menjaga hubungan matematis antara // dan % tetap konsisten.

Modulo dan divmod #

Operator % menghasilkan sisa pembagian. Untuk bilangan negatif, tanda hasil mengikuti tanda pembagi:

python
>>> 17 % 5
2
>>> -17 % 5
3
>>> 17 % -5
-3

Hasil tersebut tetap memenuhi rumus a == (a // b) * b + (a % b). Sebagai contoh, -17 == (-4) * 5 + 3 memang benar. Operator % praktis untuk menguji bilangan genap atau ganjil, sedangkan floor division cocok untuk konversi satuan waktu seperti menit ke jam.

Fungsi bawaan divmod() mengembalikan pasangan hasil bagi dan sisa dalam satu langkah:

python
>>> divmod(17, 5)
(3, 2)
>>> hasil_bagi, sisa = divmod(17, 5)
>>> hasil_bagi
3
>>> sisa
2

Nilai balik divmod(17, 5) adalah tuple (3, 2) — hasil bagi 3 dan sisa 2. Pola unpacking pada baris hasil_bagi, sisa = divmod(17, 5) memecah tuple tersebut menjadi dua variabel terpisah.

Operator Pangkat #

Operator ** mengangkat bilangan ke pangkat tertentu. Eksponen boleh berupa float untuk menghitung akar, atau bilangan negatif untuk kebalikan pangkat:

python
>>> 2 ** 10
1024
>>> 9 ** 0.5
3.0
>>> 2 ** -2
0.25

Perhatikan bahwa 9 ** 0.5 menghitung akar kuadrat dan menghasilkan 3.0 bertipe float. Sifat asosiatif operator ** yang mengejutkan akan kita bahas tuntas pada Chapter Precedence dan Associativity.

Pembagian dengan Nol #

Pembagian apa pun dengan nol memicu exception ZeroDivisionError dan menghentikan program:

python
>>> 10 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 10 // 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 10 % 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer modulo by zero

Interpreter Python menolak operasi apa pun yang pembaginya nol, baik /, //, maupun %. Cara menangkap exception dengan try/except dibahas tuntas pada Section Exception Handling; untuk sekarang, pastikan nilai pembagi tidak pernah nol sebelum menghitung.