Fungsi Pengganti Kelemahan Round() Pada Visual Basic


  • SPYRO KiD
  • admin[~@t~]spyrozone[~d.t~]net
  • Thursday, July 22nd, 2010
  • CopyLEFT (c) 2011++ www.spyrozone.net All Rights Reserved


Ketika saya sedang menangani project Sistem Informasi Giling PG. Pesantren Baru di Kota Kediri tempo hari, saya mendapat sebuah kasus kecil yang cukup menarik. Salah satu tugas saya adalah membuat aplikasi dengan vb6 untuk menangkap nilai dari sebuah Timbangan digital yang mengunakan serial comm, lalu secara otomatis melemparnya ke sebuah input text pada browser dengan membuat sebuah firefox extension sebagai jembatannya.

Client menginginkan agar nilai pada timbangan yang awalnya dalam satuan kilogram (kg) diconvert kedalam kwintal (kw) dengan aturan pembulatan sebagai berikut:

Aturan pembulatan yang diinginkan client

Aturan pembulatan yang diinginkan client

  • Berat dengan nilai desimal x,1 – x,4 akan dibulatkan kebawah.
  • Berat dengan nilai desimal x,5 – x,9 akan dibulatkan keatas.

Awalnya saya menggunakan fungsi Round(), namun ada komplain dari user karena hasil pembulatan dinilai salah. Hmm.. setelah memperhatikan kembali pembulatan yang dilakukan Round(), saya baru menyadari bahwa ternyata fungsi Round() memiliki perilaku yang tidak sesuai dengan harapan:

Hasil pembulatan dengan round()

Hasil pembulatan dengan round()

Perhatikan gambar diatas.

  • 0,5 seharusnya dibulatkan menjadi 1.
  • 2,5 seharusnya dibulatkan menjadi 3, bukan malah menjadi 2.
  • Begitu pula dengan 4,5 dan seterusnya.

Penyelesaian

Hmm.. karena baik INT maupun CINT memberikan hasil yang sama dengan Round, Saya menggunakan fungsi berikut sebagai pengganti fungsi Round()

Public Function SpyRound(dNumber As Double, Optional doNotRoundUpIfLessThan As Double = 0.5) As Double
Dim sNumber As String: Dim arVal() As String: sNumber = dNumber: If InStr(1, sNumber, ".") = 0 Then SpyRound = dNumber Else: arVal = Split(sNumber, "."): sNumber = "0." & arVal(1): dNumber = Val(sNumber): If dNumber < doNotRoundUpIfLessThan Then SpyRound = Val(arVal(0)) Else: SpyRound = Val(arVal(0)) + 1
End Function

Perbandingan output fungsi Round() dan SpyRound() bisa anda lihat pada gambar di bawah ini:

Perbandingan round() dan spyround()

Perbandingan round() dan spyround()

Mengubah Batas Pembulatan

Untuk merubah batas pembulatan sesuka hati, Anda dapat menggunakan fungsi berikut:

SpyRound(x,batas_yang_anda_inginkan)

Misalnya Anda ingin membulatkan Angka desimal 0.6 keatas, maka penulisan fungsi SpyRound() adalah sebagai berikut:

SpyRound(x,0.6)

Atau, ubah saja fungsi SpyRound() pada baris:

doNotRoundUpIfLessThan As Double = 0.5

menjadi

doNotRoundUpIfLessThan As Double = 0.6

Hasilnya kurang lebih demikian:

6.4 →Menjadi→ 6
6.5 →Menjadi→ 6
6.6 →Menjadi→ 7
6.7 →Menjadi→ 7

Download Source Code

Berikut adalah source code perbandingan fungsi Round() dan SpyRound() pada artikel ini:

Download
Penutup

Kesalahan kecil, namun bisa berakibat sangat fatal ketika kita berada di lingkungan industri >’_'<

Semoga bermanfaat :)

Revisi

  • 16 Juli 2011 @ 2:30:27 PM
    • Perbaikan kesalahan perhitungan ketika Angka > 60
    • Penambahan parameter & panduan untuk mengubah batas pembulatan sesuai keinginan


//E.O.F