Mari kita coba memahami apa perbedaan antara tipe variabel desimal, float, dan ganda di .NET dan kapan sebaiknya digunakan dalam kasus penggunaan yang benar dan berapa presisi masing-masing variabel tersebut.

float dan double adalah tipe titik biner mengambang. Dengan kata lain, mereka mewakili angka seperti ini:

10001.10010110011

Bilangan biner dan lokasi titik biner keduanya dikodekan dalam nilai.

decimal adalah tipe titik desimal mengambang. Dengan kata lain, mereka mewakili angka seperti ini:

12345.65789

Sekali lagi, angka dan lokasi titik desimal keduanya dikodekan dalam nilai — itulah yang menjadikan decimal masih bertipe titik mengambang, bukan tipe titik tetap.

Hal penting yang perlu diperhatikan adalah manusia terbiasa merepresentasikan bilangan bulat dalam bentuk desimal, dan mengharapkan hasil yang tepat dalam representasi desimal; tidak semua angka desimal dapat direpresentasikan secara tepat dalam floating point biner — 0,1, misalnya — jadi jika Anda menggunakan nilai floating point biner, Anda sebenarnya akan mendapatkan perkiraan 0,1. Anda masih akan mendapatkan perkiraan saat menggunakan titik desimal mengambang — misalnya, hasil pembagian 1 dengan 3 tidak dapat direpresentasikan secara tepat.

Adapun apa yang harus digunakan ketika:

  • Untuk nilai yang merupakan “desimal eksak alami”, sebaiknya gunakan decimal. Hal ini biasanya cocok untuk konsep apa pun yang ditemukan oleh manusia: nilai finansial adalah contoh paling nyata, namun ada juga konsep lain. Misalnya saja skor yang diberikan kepada penyelam atau pemain seluncur es.
  • Untuk nilai-nilai yang lebih merupakan artefak alam yang tidak dapat diukur secara tepat, float/double lebih tepat. Misalnya, data ilmiah biasanya disajikan dalam bentuk ini. Di sini, nilai asli tidak akan 'akurat desimal' pada awalnya, sehingga hasil yang diharapkan tidak penting untuk mempertahankan 'akurasi desimal'. Tipe titik biner mengambang jauh lebih cepat digunakan dibandingkan desimal.

Terlebih lagi, presisi adalah perbedaan utamanya.

Mengambang — 7 digit (32 bit)

Ganda-15–16 digit (64 bit)

Desimal -28–29 digit penting (128 bit)

Desimal memiliki presisi yang jauh lebih tinggi dan biasanya digunakan dalam aplikasi keuangan yang memerlukan tingkat akurasi yang tinggi. Desimal jauh lebih lambat (hingga 20X kali dalam beberapa pengujian) dibandingkan double/float.

Desimal dan Float/Ganda tidak dapat dibandingkan tanpa pemeran sedangkan Float dan Ganda dapat dibandingkan. Desimal juga memungkinkan pengkodean atau akhiran angka nol.

float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);

Hasil :

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333