Wednesday, February 22, 2017

Cara Merubah Angka Desimal Menjadi Pecahan di Python

Cara Mengubah 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)

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)

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)

hasilnya
1.23457 = 5560008991962793/4503599627370496

Bentuk lainnya:
import fractions
#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)

hasilnya
0.5 = 1/2
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)

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.

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')

Namun angka yang panjang tersebut tidak sepenuhnya diperlukan sehingga Python menampilkan pembulatan untuk bilangan desimal 0.1 adalah 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)

>>> pecahan (0.1)
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 ^^


EmoticonEmoticon