Lewati ke isi
Lembar

Kenapa Uang Sebaiknya Disimpan sebagai Integer

Rp 0,1 + Rp 0,2 tidak selalu sama dengan Rp 0,3 di komputer. Begini cara aman menyimpan nominal uang di aplikasi.

Coba buka konsol browser dan ketik 0.1 + 0.2. Hasilnya bukan 0.3, melainkan 0.30000000000000004. Ini bukan bug JavaScript. PHP, Python, dan hampir semua bahasa lain berperilaku sama.

Kenapa terjadi

Komputer menyimpan angka pecahan dalam bentuk biner. Sebagian pecahan desimal, seperti 0,1, tidak bisa ditulis tepat dalam biner, sama seperti 1/3 tidak bisa ditulis tepat dalam desimal (0,3333…). Yang tersimpan adalah angka yang sangat dekat, tetapi tidak sama persis.

Untuk satu perhitungan, selisihnya tidak terlihat. Masalah muncul saat ribuan angka dijumlahkan, atau saat dua angka dibandingkan dengan ==.

Solusi untuk Rupiah

Transaksi Rupiah sehari-hari tidak memakai sen. Jadi cara paling sederhana adalah menyimpan uang sebagai bilangan bulat Rupiah:

Nilai Disimpan sebagai
Rp 15.200 15200
Rp 1.250.000 1250000

Di database, pakai INTEGER atau BIGINT, bukan FLOAT atau DOUBLE.

$table->unsignedInteger('price'); // sampai Rp 4,29 miliar
$table->unsignedBigInteger('balance'); // untuk saldo yang bisa sangat besar

Bagaimana dengan persen?

Diskon 12,5% dari Rp 37.900 menghasilkan Rp 4.737,5. Tentukan aturan pembulatannya sekali, lalu pakai di semua tempat:

$diskon = intdiv($harga * 125, 1000); // dibulatkan ke bawah: 4737

Yang penting bukan ke mana dibulatkan, tetapi konsisten. Laporan yang memakai aturan pembulatan berbeda di dua tempat pasti selisih.

Ringkasan

  • Jangan simpan uang sebagai float.
  • Rupiah disimpan sebagai integer.
  • Tentukan satu aturan pembulatan untuk persen, dan patuhi di semua tempat.

Ditulis oleh

Dimas Prasetyo

Membangun aplikasi kasir, gudang, dan keuangan untuk UMKM sejak 2016. Suka menjelaskan hal rumit dengan contoh toko kelontong.

Bacaan terkait