Terkait dengan artikel sebelumnya tentang problem perhitungan pecahan di JavaScript. Ternyata bahasa pemrograman PHP juga memiliki problem "bugs" yang hampir sama. Memang sangat sulit dipercaya, tapi kami akan buktikan!
Khususnya untuk rekan-rekan software programmer dan pengembang aplikasi web. Silahkan lihat penjelasan dan solusinya berikut ini.
Sekilas Tentang PHP
PHP (PHP Hypertext Preprocessor) adalah salah satu bahasa pemrograman yang cukup populer. Jika di artikel sebelumnya pernah kami ulas tentang bahasa pemrograman JavaScript yang dijalankan di web browser. Berbeda dengan JavaScript, code program PHP khususnya hanya akan dijalankan di server. Yang umum disebut dengan istilah server-side scripting.
Selain PHP ada juga beberapa server-side scripting lainnya seperti: Perl, Python, ASP Classic, ASP.Net, Ruby, Java Server Pages, dsb.
Apakah PHP banyak yang menggunakan? Jawabannya: Ya! Facebook adalah salah satu contoh website yang dibangun dengan bahasa pemrograman PHP. Bahkan menurut Wikipedia, per Januari 2013 ada lebih dari 240 juta website dibangun dengan bahasa pemrograman ini.
Perhitungan Pecahan PHP Bermasalah
Dengan kalkulator atau Microsoft Excel jumlahkan dua bilangan berikut ini:
100316.58 + 32000
Hasilnya:
132316.58
Untuk lebih jelasnya kami akan buat contoh program PHP sederhana dengan menggunakan perhitungan debet dan credit. Seperti layaknya yang bisa kita temukan dalam software akuntansi atau sistem keuangan:
<?php
$debet1 = 100316.58;
$debet2 = 32000;
$total_db = $debet1 + $debet2;
$total_cr = 132316.58;
if ($total_db == $total_cr) {
echo "Balance";
} else {
echo "Selisih: " . ($total_db - $total_cr);
}
?>
Hasil yang diharapkan adalah:
Balance
Namun, jika kita jalankan hasilnya:
Selisih: 2.9103830456734E-11
Dalam software akuntansi atau sistem keuangan, jika ada masalah perhitungan seperti diatas pasti akan fatal akibatnya. Karena seperti yang kita tahu, standard akutansi keuangan mewajibkan: input total debet dan kredit harus sama (balance). Jika ada selisih, maka akan salah juga semua output laporan keuangan yang dihasilkan.
Kenapa Bisa Problem?
Jawabannya sama seperti artikel kami sebelumnya tentang problem perhitungan pecahan di JavaScript. Memang ada masalah di perhitungan pecahan. Ini adalah limit batasan dan kelemahan komputer. Dan kami sudah buktikan diatas. Masalah ini ada juga di bahasa pemrograman PHP.
Solusinya
Untuk mendapatkan hasil perhitungan yang lebih presisi di PHP kita bisa gunakan BC Math Function.
Berikut rangkuman beberapa fungsi perhitungan dasar matematika yang umum digunakan (selengkapnya lihat di dokumentasi):
- Pejumlahan : bcadd()
- Pengurangan : bcsub()
- Perkalian : bcmul()
- Pembagian : bcdiv()
Berikut perbaikan menggunakan fungsi BC Math untuk contoh program yang tadi bermasalah:
<?php
$debet1 = 100316.58;
$debet2 = 32000;
$total_db = bcadd($debet1, $debet2, 2);
$total_cr = 132316.58;
if ($total_db == $total_cr) {
echo "Balance";
} else {
echo "Selisih: " . ($total_db - $total_cr);
}
?>
Silahkan dicoba. Hasilnya pasti akan sesuai dengan perhitungan manual.
Penutup
Problem ini jarang diketahui oleh para pengembang aplikasi web dan software programmer (khususnya programmer pemula). Bahkan pada saat artikel ini kami buat, tidak kami temukan satupun ulasan atau peringatan tentang adanya masalah ini di buku-buku pemrograman PHP, khususnya yang dijual di toko-toko buku Indonesia.
Akhir kata, jika bermanfaat. Jangan lupa share artikel ini. Agar bisa diketahui rekan-rekan programmer PHP lainnya juga.