Mengapa tipe data float tidak baik untuk merepresentasikan mata uang?

Roland Raymond Dino
Badr Interactive
Published in
3 min readMar 8, 2024
Photo by Eduardo Soares on Unsplash

Dalam kebutuhan saat ini, sudah sangat banyak usecase yang mengharuskan kita menyimpan data mata uang ke dalam database. Banyak cara untuk menyimpan data berupa angka ke dalam database, bisa dengan jenis tipe data integer, fixed point ataupun floating point. Kira-kira kenapa hal ini perlu menjadi sebuah concern ketika database engineer atau database architect membuat dan/atau mendesign sebuah database?

Mengenal tipe data untuk menyimpan angka pada database SQL

Pada umumnya terdapat 3 jenis tipe data yang dapat digunakan untuk menyimpan data angka pada SQL yaitu integer, fixed point ataupun floating point.

  1. Integer

Integer merupakan tipe data yang dapat digunakan untuk menyimpan bilangan bulat. Dalam database SQL integer sendiri dapat terbagi menjadi lima dengan range masing-masing, yaitu tinyint, smallint, mediumint, int dan bigint.

2. Fixed Point

Fixed point merupakan tipe data yang dapat menyimpan nilai pecahan (desimal) dengan jumlah digit pecahan yang sudah ditentukan. Dalam SQL sendiri ada dua tipe data yang dapat menyimpan fixed point yaitu decimal dan numeric.

3. Floating Point

Floating point juga merupakan tipe data yang dapat menyimpan nilai pecahan (desimal). Akan tetapi, floating point dapat merepresentasikan angka desimal tidak tetap. Ini berarti bahwa komputer menyimpan angka dalam format yang bisa sangat presisi (mewakili banyak digit). Dalam SQL sendiri ada dua tipe data yang dapat mewakili floating point yaitu float (single precission) dan double (double precission). Perbedaan mendasar antara float dan double sendiri merupakan jangkauannya.

Semakin banyak digit pada floating point, seharusnya tingkat presisinya semakin baik. Akan tetapi, mengapa tidak disarankan untuk menyimpan mata uang?

Alasan utamanya karena tingkat presisi yang dibutuhkan dalam usecase mata uang bukan hanya dalam hal penyimpanan melainkan juga dalam segi kalkulasi. Dimana kelebihan atau kekurangan perhitungan dapat menyebabkan laba atau rugi dalam sistem keuangan.

Dalam kasus mata uang rupiah mungkin tidak akan menjadi suatu masalah karena satuan terkecil pecahan rupiah adalah Rp100. Akan tetapi, dalam kasus mata uang dollar dimana mereka memiliki dollar dan sen dimana setiap satuan uang dimulai dengan angka 1 dalam satuan uangnya tentu akan berbeda. Ketika standard yang diterapkan adalah dollar maka satuan mata uang sen akan direpresentasikan dalam bentuk pecahan.

Pada sistem uang, angka-angka direpresentasikan dalam sistem bilangan basis 10 yang berarti ketika kita ingin menuliskan 1.25 maka dalam data akan tertulis 125 x 10^-2. Akan tetapi dalam floating point numbers (IEEE-754) dimana merupakan sistem bilangan basis 2 (biner) representasinya akan menjadi 0 01111111 01000000000000000000000 (4 bytes) atau dalam kalkulasi matematika mudahnya adalah 10 x 2^-3. Dan ini menjadi penyebab utama mengapa float dan double ini kurang cocok untuk menyimpan data mata uang karena sebagian besar sistem mata uang tidak dapat memiliki representasi pasti dalam (bilangan bulat) x (bilangan 2 pangkat). Hal ini diperburuk dengan ketika kita melakukan kalkulasi penjumlahan, pengurangan, perkalian, ataupun pembagian pada bilangan yang tak pasti seperti pada float akan menyebabkan tingkat error akan jauh meningkat.

Selanjutnya kita akan mengambil contoh sederhana kalkulasi dalam perhitungan nilai float pada bahasa pemrograman Java.

class Main {
public static void main(String[] args) {
System.out.println(1000000.0f + 1.3f - 1000000.0f);
}
}

Di kode di atas, tentu saja hasil yang kita inginkan adalah 1.3. Akan tetapi apa yang dihasilkan adalah 1.3125. Hal ini tidak hanya terjadi pada bahasa pemrograman Java tetapi terjadi juga pada semua bahasa pemrograman yang menggunakan floating point number dengan bilangan basis 2 (biner).

Lalu sebaiknya menggunakan tipe data apa untuk menyimpan data mata uang?

Di SQL, tipe data yang umum digunakan untuk menyimpan nilai mata uang adalah DECIMAL. DECIMAL memungkinkan kita untuk menentukan jumlah digit secara total dan juga digit di belakang koma, sehingga memberikan presisi yang lebih baik untuk perhitungan mata uang.

Dengan hal-hal yang sudah disebutkan di atas dapat disimpulkan bahwa fixed point biasanya lebih disukai untuk kasus di mana presisi tetap diperlukan (seperti perhitungan keuangan), sementara floating point dapat lebih efisien untuk perhitungan ilmiah atau teknis yang memerlukan rentang yang sangat besar dengan sedikit kehilangan presisi.

--

--