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 gunakan float untuk perhitungan keuangan atau apapun yang membutuhkan ketelitian desimal yang eksak. Gunakan modul decimal sebagai 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 buat Decimal dari string, bukan dari float. Decimal("0.1") menghasilkan 0.1 yang eksak, sedangkan Decimal(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 eksak0.1 + 0.2 != 0.3 adalah sifat IEEE 754, bukan bug. Gunakan math.isclose() untuk membandingkan float, bukan ==.
  • Modul math untuk 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() dan math.degrees() untuk konversi.
  • math.atan2(y, x) lebih aman dari math.atan(y/x) karena menangani semua kuadran dengan benar.
  • Modul decimal untuk perhitungan keuangan — selalu buat dari string (Decimal("0.1")), bukan dari float (Decimal(0.1)).
  • Modul fractions untuk aritmatika pecahan yang eksak tanpa rounding error sama sekali.
  • Modul statistics untuk analisis data dasar tanpa dependency eksternal; pertimbangkan NumPy atau pandas untuk kebutuhan lebih besar.

← Sebelumnya: IO   Berikutnya: Collections →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact