Soal 1Pilihan yang paling tepat ketika kamu tidak bisa mentolerir bahkan satu sen drift dalam perhitungan uang?
decimal dan fractions — Aritmetika Presisi tanpa Error Float
Pelajari modul decimal dan fractions Python dari dasar. Mencakup masalah 0.1 + 0.2 != 0.3 dengan float, perhitungan uang yang tepat dengan Decimal (dan kenapa kamu membuat Decimal dari string), aritmetika dengan Fraction yang otomatis disederhanakan, dan memilih di antara tiga tipe numerik — dengan latihan praktik yang bisa dijalankan.
Artikel ini membahas dua modul untuk kasus di mana `float` menyebabkan masalah. decimal.Decimal melakukan aritmetika base-10 yang tepat, yang menjadikannya esensial untuk perhitungan uang; fractions.Fraction menjaga pembilang dan penyebut sebagai integer sehingga bisa menghitung dengan pecahan tersederhanakan secara tepat. Keduanya ada untuk menghilangkan error pembulatan yang tak terhindarkan dari float.
Error Pembulatan Float dan decimal.Decimal — Jangan Pakai Float untuk Matematika Presisi
float Python direpresentasikan secara internal dalam biner, jadi pecahan desimal seperti `0.1` yang tidak terbagi rapi dalam biner membawa error pembulatan kecil. Contoh paling terkenal adalah `0.1 + 0.2 == 0.3` yang mengembalikan `False`. Untuk grafik atau komputasi ilmiah error itu bisa diabaikan, tapi dalam penjumlahan finansial bahkan sedikit drift menjadi kritis.
Itulah sebabnya decimal.Decimal ada. Ia direpresentasikan secara internal dalam base 10, jadi membuat satu dari string "0.1" memungkinkanmu menghitung tanpa error.
0.1. Decimal menggunakan representasi internal base-10, jadi menghitung tepat seperti string masukan mengatakannya, tapi lebih lambat dari float. Untuk pemrosesan uang dan pajak, pilih Decimal.from decimal import Decimal
# error pembulatan float
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False ← berlawanan dengan intuisi!
# Buat Decimal dari string (dari float akan mewarisi error)
a = Decimal("0.1")
b = Decimal("0.2")
print(a + b) # 0.3
print(a + b == Decimal("0.3")) # True
# Contoh perhitungan uang
price = Decimal("1980")
tax_rate = Decimal("0.10")
total = price * (Decimal("1") + tax_rate)
print(total) # 2178.00
Buat Decimal dari string, bukan dari float
Kalau kamu memberi float — Decimal(0.1) — kamu menyerahkan nilai yang sudah membawa error pembulatan, jadi kamu berakhir dengan Decimal yang masih punya error float-nya. Selalu beri string: Decimal("0.1"). Sulit terlihat di test dan ini jebakan klasik yang menghasilkan drift satu sen di production untuk pertama kalinya.
fractions.Fraction — Menjaga Pecahan tetap Pecahan
Fraction adalah tipe yang menyimpan pembilang dan penyebut sebagai integer untuk aritmetika. Buat satu dengan Fraction(1, 3), dan penjumlahan, pengurangan, dan perkalian berikutnya mengembalikan hasil pecahan tersederhanakan. Sebagai float, 1/3 adalah aproksimasi 0.3333333333333333, tapi dengan Fraction ia tetap sebagai "sepertiga" itu sendiri.
+ / - / * juga Fraction, dan otomatis disederhanakan. Kamu bisa konversi ke float dengan float(f), tapi itu memperkenalkan error pembulatan.| Tipe | Representasi internal | Paling cocok untuk |
|---|---|---|
| int | Integer | Hitungan dan pencatatan (tanpa error) |
| float | Floating-point biner | Komputasi ilmiah, grafik (cepat, dengan error) |
| Decimal | Representasi base-10 | Uang dan pajak (saat presisi base-10 penting) |
| Fraction | Pembilang dan penyebut (integer) | Rasio dan probabilitas (saat ingin bentuk tersederhanakan) |
Objek Fraction mengekspos atribut untuk pembilang dan penyebut. f.numerator mengembalikan pembilang dan f.denominator mengembalikan penyebut — keduanya setelah penyederhanaan. Misalnya, Fraction(2, 6) dinormalisasi secara internal menjadi Fraction(1, 3), jadi .numerator adalah 1 dan .denominator adalah 3.
| Atribut / Method | Arti | Contoh |
|---|---|---|
| f.numerator | Pembilang | Fraction(1, 3).numerator → 1 |
| f.denominator | Penyebut | Fraction(1, 3).denominator → 3 |
| float(f) | Konversi ke float | float(Fraction(1, 2)) → 0.5 |
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Saat membuat Decimal, cara benar yang tidak memperkenalkan error?
Soal 3Kamu pakai yang mana saat ingin menghitung rasio atau probabilitas sebagai pecahan tersederhanakan?