This blog has moved to http://ikhwanhayat.net

Monday, August 21, 2006

2.5 Dibundarkan Jadi 3 atau 2?

Masa sekolah rendah dulu mesti korang semua pernah belajar tentang membundar atau membulatkan nombor (rounding). "1kHz (bukan nama sebenar), kamu bundarkan nombor 2.9 ni kepada integer yang hampir!", kata Cikgu Asmah yang garang itu. Dalam kes ini, aku sepatutnya menjawab 3. Senang je, cuma tengok sama ada nombor perpuluhan tu lebih atau kurang dari 5. Kalau 2.4, jadi 2. Kalau 2.7, jadi 3. Tapi kalau 2.5? Ini betul-betul atas pagar ni? Mestilah jawapannya 3, macam Cikgu Asmah cakap. Tapi sebenarnya, ia boleh jadi sama ada 3 atau 2, bergantung kepada jenis pembundaran atau "rounding" yang digunakan. Dua jenis yang biasa digunakan ialah Arithmetic Rounding dan Banker's Rounding. Arithmetic Rounding (a.k.a 4/5 Rounding, or Round to Larger) Ini jenis yang Cikgu Asmah dah ajar seperti di atas. Kalau perpuluhan 5, pilihlah nombor yang lebih besar. Cuma persoalannya di sini, kalau nombor tu negatif, macam -2.5? Kalau diikutkan, bundarkan kepada nombor lebih besar maka dia akan jadi -2 (sebab -2 lebih besar dari -3). Cara ini dipanggil Symmetric Rounding. Tapi kalau kita abaikan tanda negatif tu, maka -2.5 jadi -3. Macam ini boleh juga, ia dinamakan Asymmetric Rounding, atau Away From Zero Rounding. Quiz: rasa-rasanya kenapa masing-masing dinamakan symmetric dan asymmetric? Banker's Rounding (a.k.a To Even, or Round to Nearest) Dalam jenis ini, nombor sentiasa di bundarkan kepada nombor genap yg terhampir. Kalau 1.5, jadi 2. Kalau 2.5, pun jadi 2. Seterusnya, 3.5 jadi 4. Dan 4.5 jadi 4 juga. Kenapa pelik sangat? Macam "bias" dan berat sebelah je. Kenapa genap asyik menang. Lihat contoh: ..nombor-nombor sebenar 1.46 + 1.45 = 2.91 ..kalau guna Arithmetic Rounding: 1.5 + 1.5 = 3.0 ..kalau guna Banker's Rounding: 1.5 + 1.4 = 2.9 Kalau kita lihat, 2.9 sebenarnya lebih hampir pada nilai sebenar iaitu 2.91 berbanding 3. |2.9-2.91| = 0.01 |3.0-2.91| = 0.09 Cara ini penting dalam pengiraan wang (thus, the name "banker", I suppose), untuk mengelakkan dari ada "sen" yang ghaib secara tiba-tiba. Pembundaran Dalam .NET Dalam .NET 2.0 (1.x tak ada), cara mudah untuk membundarkan nombor ialah menggunakan Math.Round(). Math.Round(2.5) akan hasilkan 2 sebab secara defaultnya Math.Round menggunakan cara Banker's Rounding. Kita boleh supply satu lagi parameter utk pastikan jenis rounding yg kita mahu, iaitu sama ada Math.Round(2.5, MidpointRounding.AwayFromZero) atau Math.Round(2.5, MidpointRounding.ToEven). ToEven utk Banker's Rounding, dan AwayFromZero utk Asymmetric Arithmetic Rounding. Untuk Symmetric Rounding aku tak jumpa macam mana nak buat. Rujukan: http://ewbi.blogs.com/develops/2003/11/vba_round_yet_a.html http://blogs.inetium.com/blogs/jgood/archive/2006/04/21/77.aspx http://msdn2.microsoft.com/en-us/library/system.midpointrounding.aspx p.s: Satu perkara yg perlu diingat, kalau buat pengiraan utk wang, *mesti* gunakan data type Decimal. Kalau untuk saintifik, lebih elok gunakan Double atau Single. p.s.s: Dlm PoEAA, Martin Fowler mencadangkan penggunakan Money class untuk mewakili wang. Ada satu method menarik, iaitu allocate yg gunakan utk membahagikan wang kepada berbilang bahagian, supaya tak ada "sen yang tercicir".

5 Comments:

At 8/22/2006 10:05:00 am, Anonymous Anonymous said...

jadi cikgu matematik la plak 1khz..

heheheh...

bagus gak.. bleh ingat ingat balik masa ngaji skoloh dulu dulu

 
At 8/22/2006 10:20:00 am, Blogger Ikhwan Hayat said...

Kena deal with some rounding problem, dan buat research sikit.. Alang2 kongsi kat sini, saje sebar ilmu.

Masa belajar dulu cuma tahu satu cara je nak bundarkan nombor. Rupanya mcm2 cara ada.

 
At 8/22/2006 10:06:00 pm, Anonymous Anonymous said...

dulu sy kat sekolah sy bundarkan 2.5 jadi 2, terus cikgu bg salah..rupanya cikgu tu tak tahu sy guna jenis Banker's Rounding.

 
At 8/22/2006 11:15:00 pm, Blogger Ikhwan Hayat said...

awak tak sengaja terbuat banker's rounding tu.. cikgu mintak arithmetic rounding :)

 
At 8/23/2006 11:48:00 am, Blogger bengkeng said...

ooooo.. camtu ke

 

Post a Comment

<< Home