Math #
Python menyediakan beberapa modul untuk komputasi numerik, masing-masing dengan tujuan yang berbeda. Modul math menangani operasi matematika umum berbasis float, decimal untuk perhitungan yang membutuhkan presisi tinggi seperti keuangan, fractions untuk aritmatika bilangan rasional yang eksak, dan statistics untuk analisis data dasar. Memahami perbedaan keempat modul ini penting agar kamu tidak terjebak menggunakan alat yang salah untuk masalah yang berbeda.
Mengapa Float Bisa Bermasalah #
Sebelum masuk ke modul, penting dipahami satu perilaku Python yang sering mengejutkan pemula: aritmatika float tidak selalu eksak.
# Perilaku float yang mengejutkan
print(0.1 + 0.2) # 0.30000000000000004 -- bukan 0.3!
print(0.1 + 0.2 == 0.3) # False
# Ini bukan bug Python -- ini sifat float IEEE 754 di semua bahasa
# ANTI-PATTERN: bandingkan float secara langsung
if total_harga == 150000.0: # bisa salah karena rounding error
pass
# BENAR: gunakan toleransi atau modul math.isclose()
import math
if math.isclose(total_harga, 150000.0, rel_tol=1e-9):
pass
# Atau gunakan modul decimal untuk perhitungan keuangan (dibahas di bawah)
Jangan gunakanfloatuntuk perhitungan keuangan atau apapun yang membutuhkan ketelitian desimal yang eksak. Gunakan moduldecimalsebagai gantinya.
Modul math — Operasi Matematika Umum
#
Modul math menyediakan fungsi matematika yang beroperasi pada tipe float. Cocok untuk komputasi ilmiah, geometri, dan perhitungan teknis umum.
Pembulatan dan Nilai Absolut #
import math
# Berbagai cara pembulatan
print(math.ceil(4.2)) # 5 -- bulatkan ke atas
print(math.ceil(-4.2)) # -4 -- ke atas menuju nol
print(math.floor(4.8)) # 4 -- bulatkan ke bawah
print(math.floor(-4.8)) # -5 -- menjauhi nol
print(math.trunc(4.8)) # 4 -- potong ke arah nol
print(math.trunc(-4.8)) # -4 -- potong ke arah nol
# Perbedaan trunc dan floor untuk angka negatif:
# trunc(-4.8) = -4 (ke arah nol)
# floor(-4.8) = -5 (ke bawah, menjauhi nol)
# Nilai absolut
print(math.fabs(-5.5)) # 5.5 -- selalu float
print(abs(-5.5)) # 5.5 -- bawaan Python, bisa int atau float
Akar, Pangkat, dan Logaritma #
import math
# Akar dan pangkat
print(math.sqrt(16)) # 4.0 -- akar kuadrat
print(math.isqrt(17)) # 4 -- akar kuadrat integer (bulatkan ke bawah)
print(math.pow(2, 10)) # 1024.0 -- selalu float
print(2 ** 10) # 1024 -- operator bawaan, bisa int
# Logaritma
print(math.log(8, 2)) # 3.0 -- log basis 2 dari 8
print(math.log(math.e)) # 1.0 -- log natural (basis e)
print(math.log10(1000)) # 3.0 -- log basis 10
print(math.log2(1024)) # 10.0 -- log basis 2 (lebih presisi dari log(x, 2))
# Eksponensial
print(math.exp(1)) # 2.718... -- e^1
print(math.exp(2)) # 7.389... -- e^2
Fungsi Trigonometri #
Semua fungsi trigonometri di math bekerja dalam radian, bukan derajat. Gunakan math.radians() dan math.degrees() untuk konversi.
import math
# Konversi sudut
print(math.radians(180)) # 3.141592... -- derajat ke radian
print(math.degrees(math.pi)) # 180.0 -- radian ke derajat
# Fungsi trigonometri dasar (input dalam radian)
print(math.sin(math.pi / 2)) # 1.0 -- sin 90°
print(math.cos(math.pi)) # -1.0 -- cos 180°
print(math.tan(math.pi / 4)) # 1.0 -- tan 45°
# Trigonometri invers (output dalam radian)
print(math.asin(1)) # 1.5707... -- π/2, yaitu 90°
print(math.acos(-1)) # 3.1415... -- π, yaitu 180°
print(math.atan(1)) # 0.7853... -- π/4, yaitu 45°
# atan2 -- lebih aman dari atan untuk menentukan kuadran
print(math.atan2(1, 1)) # 0.7853... -- sudut dari titik (1,1) ke origin
print(math.atan2(-1, 1)) # -0.785... -- sudut dari titik (1,-1) ke origin
Fungsi Kombinatorial #
import math
# Faktorial
print(math.factorial(5)) # 120 -- 5! = 5×4×3×2×1
print(math.factorial(0)) # 1 -- 0! = 1 per definisi
# Kombinasi C(n, k) -- memilih k item dari n tanpa urutan
print(math.comb(5, 2)) # 10 -- C(5,2)
print(math.comb(10, 3)) # 120
# Permutasi P(n, k) -- memilih k item dari n dengan urutan
print(math.perm(5, 2)) # 20 -- P(5,2)
print(math.perm(5)) # 120 -- P(5,5) = 5!
Fungsi Utilitas #
import math
# Hitung jarak Euclidean / panjang vektor
print(math.hypot(3, 4)) # 5.0 -- √(3²+4²)
print(math.hypot(1, 1, 1)) # √3 -- mendukung n dimensi (Python 3.8+)
# GCD dan LCM
print(math.gcd(12, 8)) # 4 -- greatest common divisor
print(math.lcm(4, 6)) # 12 -- least common multiple (Python 3.9+)
print(math.gcd(12, 8, 6)) # 2 -- GCD lebih dari dua bilangan (Python 3.9+)
# Perbandingan float dengan toleransi
print(math.isclose(0.1 + 0.2, 0.3)) # True -- dengan toleransi relatif default
print(math.isclose(1000.0, 1001.0, rel_tol=0.01)) # True -- toleransi 1%
print(math.isclose(0.0, 1e-10, abs_tol=1e-9)) # True -- toleransi absolut
# Cek nilai khusus float
print(math.isfinite(1.0)) # True
print(math.isfinite(math.inf)) # False
print(math.isinf(math.inf)) # True
print(math.isnan(math.nan)) # True
print(math.isnan(float("nan"))) # True
Konstanta Matematika #
import math
print(math.pi) # 3.141592653589793 -- π
print(math.e) # 2.718281828459045 -- bilangan Euler
print(math.tau) # 6.283185307179586 -- τ = 2π
print(math.inf) # inf -- tak terhingga positif
print(math.nan) # nan -- Not a Number
Modul decimal — Presisi Tinggi
#
Modul decimal mengimplementasikan aritmatika desimal dengan presisi yang dapat dikontrol. Ini adalah solusi yang tepat untuk kalkulasi keuangan, akuntansi, atau apapun yang tidak boleh ada rounding error.
from decimal import Decimal, getcontext
# Perbandingan langsung
print(0.1 + 0.2) # 0.30000000000000004 -- float biasa
print(Decimal("0.1") + Decimal("0.2")) # 0.3 -- presisi eksak
# ANTI-PATTERN: buat Decimal dari float
print(Decimal(0.1)) # 0.1000000000000000055511151231257827021181583404541015625
# -- float sudah kehilangan presisi sebelum masuk Decimal!
# BENAR: buat Decimal dari string
print(Decimal("0.1")) # 0.1 -- presisi terjaga
Kontrol Presisi dan Pembulatan #
from decimal import Decimal, getcontext, ROUND_HALF_UP, ROUND_DOWN
# Set presisi global (jumlah digit signifikan)
getcontext().prec = 10
hasil = Decimal("1") / Decimal("3")
print(hasil) # 0.3333333333 -- 10 digit signifikan
# Pembulatan dengan metode tertentu
harga = Decimal("1234.5678")
print(harga.quantize(Decimal("0.01"))) # 1234.57 -- ROUND_HALF_EVEN (default)
print(harga.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)) # 1234.57
print(harga.quantize(Decimal("0.01"), rounding=ROUND_DOWN)) # 1234.56
# Contoh keuangan: hitung total belanja
def hitung_total(harga_satuan: str, jumlah: int, pajak_persen: str) -> Decimal:
harga = Decimal(harga_satuan)
pajak = Decimal(pajak_persen) / Decimal("100")
subtotal = harga * jumlah
total = subtotal * (1 + pajak)
return total.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(hitung_total("99.99", 3, "11")) # 332.97
Selalu buatDecimaldari string, bukan dari float.Decimal("0.1")menghasilkan0.1yang eksak, sedangkanDecimal(0.1)mewarisi ketidakpresisian float.
Modul fractions — Bilangan Rasional
#
Modul fractions merepresentasikan bilangan sebagai pecahan eksak (pembilang/penyebut). Berguna untuk perhitungan matematika yang perlu hasil eksak tanpa error floating point.
from fractions import Fraction
# Buat Fraction dari berbagai sumber
print(Fraction(1, 3)) # 1/3
print(Fraction("3/7")) # 3/7
print(Fraction("0.25")) # 1/4 -- konversi dari string desimal
print(Fraction(0.25)) # 1/4 -- aman karena 0.25 eksak dalam float
# Aritmatika eksak
a = Fraction(1, 3)
b = Fraction(1, 6)
print(a + b) # 1/2 -- bukan 0.4999... atau 0.5000001
print(a * b) # 1/18
print(a - b) # 1/6
print(a / b) # 2
# Akses pembilang dan penyebut
f = Fraction(5, 6)
print(f.numerator) # 5
print(f.denominator) # 6
# Fraction otomatis disederhanakan
print(Fraction(6, 4)) # 3/2 -- bukan 6/4
print(Fraction(10, 5)) # 2 -- bukan 10/5
Modul statistics — Analisis Data Dasar
#
Modul statistics menyediakan fungsi statistik deskriptif yang siap pakai tanpa perlu library tambahan seperti NumPy.
import statistics
data = [4, 8, 6, 5, 3, 2, 8, 9, 2, 5]
# Ukuran pemusatan
print(statistics.mean(data)) # 5.2 -- rata-rata
print(statistics.median(data)) # 5.0 -- nilai tengah (diurutkan dulu)
print(statistics.mode([1,1,2,3])) # 1 -- nilai yang paling sering muncul
print(statistics.multimode([1,1,2,2,3])) # [1, 2] -- semua mode (Python 3.8+)
# Ukuran penyebaran
print(statistics.stdev(data)) # 2.393... -- standar deviasi sampel
print(statistics.pstdev(data)) # 2.270... -- standar deviasi populasi
print(statistics.variance(data)) # 5.733... -- variansi sampel
print(statistics.pvariance(data)) # 5.16 -- variansi populasi
# Kuantil (Python 3.8+)
print(statistics.quantiles(data, n=4)) # kuartil Q1, Q2, Q3
Kapan Pakai statistics vs Library Lain
#
Analisis data sederhana, tidak ada dependency eksternal?
✓ Gunakan modul statistics bawaan Python
Dataset besar, performa penting, atau butuh lebih banyak fungsi?
✓ Gunakan NumPy (pip install numpy)
Analisis data dengan DataFrame, groupby, atau visualisasi?
✓ Gunakan pandas (pip install pandas)
Machine learning atau statistik lanjutan?
✓ Gunakan scipy.stats (pip install scipy)
Memilih Modul yang Tepat #
Perhitungan matematika umum (trigonometri, logaritma, akar)?
✓ Gunakan modul math
Perhitungan keuangan atau butuh kontrol presisi desimal?
✓ Gunakan modul decimal -- buat selalu dari string, bukan float
Butuh hasil pecahan yang eksak (1/3, 7/8)?
✓ Gunakan modul fractions
Analisis statistik dasar (mean, median, stdev)?
✓ Gunakan modul statistics
Perlu membandingkan dua nilai float?
✓ Gunakan math.isclose(), jangan == langsung
Ringkasan #
- Float tidak selalu eksak —
0.1 + 0.2 != 0.3adalah sifat IEEE 754, bukan bug. Gunakanmath.isclose()untuk membandingkan float, bukan==.- Modul
mathuntuk operasi matematika umum: pembulatan (ceil,floor,trunc), akar dan pangkat (sqrt,pow,isqrt), logaritma (log,log2,log10), trigonometri, dan kombinatorial (comb,perm,factorial).- Fungsi trigonometri bekerja dalam radian — gunakan
math.radians()danmath.degrees()untuk konversi.math.atan2(y, x)lebih aman darimath.atan(y/x)karena menangani semua kuadran dengan benar.- Modul
decimaluntuk perhitungan keuangan — selalu buat dari string (Decimal("0.1")), bukan dari float (Decimal(0.1)).- Modul
fractionsuntuk aritmatika pecahan yang eksak tanpa rounding error sama sekali.- Modul
statisticsuntuk analisis data dasar tanpa dependency eksternal; pertimbangkan NumPy atau pandas untuk kebutuhan lebih besar.