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: