Cara Merubah Angka Desimal Menjadi Pecahan di Python
Cara Merubah Angka Desimal Menjadi Pecahan di Python - Beberapa waktu yang lalu, salah seorang adik tingkat kami menanyakan bagaimana cara merubah angka desimal menjadi pecahan menggunakan Python. Tak lama kemudian, mulai bermunculan adik-adik tingkat lainnya yang menanyakan hal yang sama.
Ternyata mereka mendapatkan tugas ini sebagai pengenalan pada dasar-dasar modul yang tersedia di Python.
Output yang diinginkan seperti ini:
>>> 0.5 = 1/2
Caranya cukup sederhana, kita cukup menggunakan modul fractions yang secara default biasanya sudah tersedia pada library Python versi 2.6 keatas.
Modul fractions menyediakan class untuk mengolah bilangan rasional. Untuk hasil seperti yang ditunjukkan diatas, class yang kita gunakan adalah class Fraction
Penggunaan class Fraction menghasilkan output numerator/denominator (pembilang/penyebut)
Sebuah Fraction atau pecahan di Python dapat dibentuk dari:
1. Sepasang bilangan bulat (integer)
Pasangan bilangan bulat ini akan berperan menjadi pembilang dan penyebut. Jika penyebutnya adalah 0 (nol) maka akan mengakibatkan ZeroDivisionError. Class yang digunakan adalah fractions.Fraction(numerator, denominator)
import fractions
f = fractions.Fraction (3, 9)
print (f)
f = fractions.Fraction (3, 9)
print (f)
dan hasilnya
3/9
2. Pecahan Lainnya
Kita bisa menggunakan pecahan untuk menghasilkan pecahan lain yang memiliki angka berbeda namun nilainya tetap sama, Class yang digunakan fractions.Fraction(other_fraction)
import fractions
pecahan = "3/9"
f = fractions.Fraction (pecahan)
print "%s = %s" %(pecahan, f)
pecahan = "3/9"
f = fractions.Fraction (pecahan)
print "%s = %s" %(pecahan, f)
hasilnya
3/9 = 1/3
3. Bilangan Desimal dan float
Pada tipe ini, Pecahan dapat dibuat menggunakan baik itu float maupun bentuk bilangan bilangan desimal biasa dengan notasi [<digit>].[<digit>]
Outputnya adalah pecahan yang memiliki nilai yang sama dengan bilangan float atau desimal tersebut. Class yang digunakan adalah fractions.Fraction(desimal) atau fractions.Fraction(float)
import fractions
#contoh untuk float
s = 1.23457
f = fractions.Fraction(s)
print "%s = %s" %(s, f)
#contoh untuk float
s = 1.23457
f = fractions.Fraction(s)
print "%s = %s" %(s, f)
hasilnya
1.23457 = 5560008991962793/4503599627370496
Bentuk lainnya:
import fractions
#contoh untuk desimal
s =0.5
f = fractions.Fraction(s)
print "%s = %s" %(s, f)
#contoh untuk desimal
s =0.5
f = fractions.Fraction(s)
print "%s = %s" %(s, f)
hasilnya
0.5 = 1/2
4. Dari String
Cara terakhir untuk membentuk pecahan adalah dengan menggunakan string. bentuk penulisannya adalah [sign] numerator/denuminator, dimana sign itu dalah tanda untuk minus(-) atau positif(+). Disini, numerator dan denuminator mempresentasikan bilangan desimal dalam bentuk string.
class yang digunakan adalah fractions.Fraction(string)
import fractions
s = ["0.5", "1.1", "-3.9"]
for i in s:
f = fractions.Fraction(i)
print "%s = %s" %(i, f)
s = ["0.5", "1.1", "-3.9"]
for i in s:
f = fractions.Fraction(i)
print "%s = %s" %(i, f)
hasilnya
0.5 = 1/2
1.1 = 11/10
-3.9 = -39/10
1.1 = 11/10
-3.9 = -39/10
Nah, itu tadi sekilas penjelasan tentang Modul fractions dan class Fraction.
Untuk pemecahan permasalahan yang ditanyakan oleh adik tingkat kami tadi, mereka diharuskan membuat fungsi agar bilangan desimal yang diinputkan akan menghasilkan output berupa bilangan pecahan yang bernilai sama dengan masukan tersebut.
Maka, sintaks yang menurut kami sederhana adalah
import fractions
def pecahan (angkaDesimal):
s = fractions.Fraction(angkaDesimal)
print "%s = %s" %(angkaDesimal, s)
def pecahan (angkaDesimal):
s = fractions.Fraction(angkaDesimal)
print "%s = %s" %(angkaDesimal, s)
Namun ternyata sintaks ini tidak memberikan hasil yang diinginkan saat bilangan yang dimasukkan adalah bilangan yang nilainya sangat kecil seperti float. Seperti saat angka 0.1 digunakan, hasilnya bukanlah 0.1 = 1/10, melainkan 0.1 = 3602879701896397/36028797018963968.
Python menganggap 0.1 adalah float, bukan angka rasional
Sehingga, nilai 0.1 hanya mendekati 1/10 dan tidak sama dengan 1/10.
Dalam biner
1/10 = 0.0001100110011001100110011001100110011001100110011... yang terus berulang tak berhingga.
1/10 = 0.0001100110011001100110011001100110011001100110011... yang terus berulang tak berhingga.
Ketika memasukkan bilangan desimal 0.1 nilai yang tersimpan di mesin adalah angka biner 0.00011001100110011001100110011001100110011001100110011010 yang dekat dengan 1/10 tapi tidak sama dengan 1/10
Kebanyakan pecahan desimal tidak diwakilkan secara tepat ke bentuk biner. Sehingga secara umum saat kamu memasukkan bilangan floating-point desimal, mesin hanya akan mencari bilangan floating-point biner terdekat dengan input kamu tersebut.
Nilai desimal sebenarnya dari 0.1 adalah 0.1000000000000000055511151231257827021181583404541015625.
>>> import decimal
>>> decimal.Decimal (0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> decimal.Decimal (0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625')
Namun angka yang panjang tersebut tidak sepenuhnya diperlukan sehingga Python menampilkan pembulatan untuk bilangan desimal 0.1 adalah 0.1
>>> 0.1
0.1
0.1
Agar lebih mudah, kita bisa melihat contoh pada pecahan 1/3. Saat menghitung 1 dibagi 3, maka hasilnya adalah 0.3333333333.... atau bisa disingkat menjadi 0.3 saja. Kamu bisa menambah angka 3 dibelakang koma sebanyak apapun yang kamu mau.
Tapi jika kamu kalikan 0.33333333333333333...tersebut dengan 3 hasilnya bukanlah angka 1. Sehingga 0.333333... tidak akan pernah sama dengan 1/3 namun 0.333333... mendekati 1/3
Untuk itu, Python memiliki fitur yang bisa merubah angka floating-point menjadi angka rasional, dimana angka rasional tersebut merupakan angka yang nilainya terdekat dengan angka floating-point tersebut. Fitur yang sama juga dapat mengembalikan bilangan rasional yang terpresentasikan sebagai float kembali menjadi bilangan rasional (yang terjadi dalam kasus kita ini. 0.1 yang kita maksudkan sebagai bilangan rasional dianggap sebagai float oleh Python). Caranya dengan membatasi ukuran penyebut (max_denominator = 1000000) menggunakan limit.denominator()
Sekarang kita modifikasi sedikit sintaksnya
from fractions import Fraction
def pecahan (angkaDesimal):
u = Fraction(angkaDesimal)
hasil = u.limit_denominator()
print "%s = %s" %(angkaDesimal, hasil)
def pecahan (angkaDesimal):
u = Fraction(angkaDesimal)
hasil = u.limit_denominator()
print "%s = %s" %(angkaDesimal, hasil)
>>> pecahan (0.1)
0.1 = 1/10
0.1 = 1/10
Gak nyangka ya, soal yang sederhana bisa panjang banget pembahasannya XD
Mungkin ada yang tahu cara lainnya, silahkan berbagi pengetahuan.
Semangat Belajar ^^
Belum ada Komentar untuk "Cara Merubah Angka Desimal Menjadi Pecahan di Python"
Posting Komentar