Apa tipe data terbaik yang digunakan untuk uang dalam C #?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
Apa tipe data terbaik yang digunakan untuk uang dalam C #?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
Jawaban:
Seperti yang dijelaskan pada desimal sebagai:
Kata kunci desimal menunjukkan tipe data 128-bit. Dibandingkan dengan tipe floating-point, tipe desimal memiliki presisi lebih dan rentang yang lebih kecil, yang membuatnya sesuai untuk perhitungan finansial dan moneter .
Anda dapat menggunakan desimal sebagai berikut:
decimal myMoney = 300.5m;
Tipe nilai desimal mewakili angka desimal mulai dari positif 79.228.162.514.264.333.543.950.335 ke negatif 79.228.162.514.264.333.593.543.950.335. Jenis nilai desimal sesuai untuk perhitungan keuangan yang membutuhkan sejumlah besar angka integral dan fraksional yang signifikan dan tidak ada kesalahan pembulatan. Jenis desimal tidak menghilangkan kebutuhan pembulatan. Sebaliknya, ini meminimalkan kesalahan karena pembulatan.
Saya ingin menunjukkan jawaban yang sangat bagus ini oleh zneak tentang mengapa double tidak boleh digunakan.
Gunakan pola Uang dari Pola Arsitektur Aplikasi Perusahaan ; tentukan jumlah sebagai desimal dan mata uang sebagai enum.
Money
nuget memiliki github dead link untuk lokasi proyek sehingga ... tidak ada docs?
Desimal. Jika Anda memilih dua kali lipat, Anda membiarkan diri Anda terbuka terhadap kesalahan pembulatan
double
dapat memperkenalkan kesalahan pembulatan karena floating point tidak dapat mewakili semua angka dengan tepat (misal 0,01 tidak memiliki representasi yang tepat di floating point). Decimal
, Di sisi lain, tidak mewakili angka persis . (Trade-off Decimal
memiliki rentang yang lebih kecil dari floating point) Floating point dapat memberi Anda * kesalahan pembulatan * yang tidak disengaja (misalnya 0.01+0.01 != 0.02
). Decimal
dapat memberikan Anda kesalahan pembulatan, tetapi hanya ketika Anda memintanya (mis. Math.Round(0.01+0.02)
mengembalikan nol)
double
dan dengan hati-hati menerapkan penskalaan dan pembulatan khusus domain bila perlu, itu bisa sangat tepat. Jika seseorang ceroboh dalam pembulatannya, decimal
dapat menghasilkan hasil yang secara semantik tidak benar (mis. Jika seseorang menambahkan bersama beberapa nilai yang seharusnya dibulatkan ke sen terdekat, tetapi sebenarnya tidak ada di sekitar mereka terlebih dahulu). Satu-satunya hal yang baik tentang decimal
scaling adalah built-in.
desimal memiliki rentang yang lebih kecil, tetapi presisi lebih besar - sehingga Anda tidak kehilangan semua uang itu dari waktu ke waktu!
Detail lengkap di sini:
Setuju dengan pola Uang: Menangani mata uang terlalu rumit ketika Anda menggunakan desimal.
Jika Anda membuat mata uang-kelas, Anda kemudian dapat menempatkan semua logika yang berkaitan dengan uang di sana, termasuk metode ToString () - yang benar, lebih banyak kontrol nilai parsing dan kontrol divisi yang lebih baik.
Juga, dengan kelas Mata Uang, tidak ada peluang untuk secara tidak sengaja menggabungkan uang dengan data lain.
Pilihan lain (terutama jika Anda menggulirkan kelas Anda sendiri) adalah menggunakan int atau int64, dan menunjuk empat digit yang lebih rendah (atau mungkin bahkan 2) sebagai "kanan titik desimal". Jadi "di tepi" Anda akan membutuhkan "* 10.000" di jalan masuk dan beberapa "/ 10000" di jalan keluar. Ini adalah mekanisme penyimpanan yang digunakan oleh Microsoft SQL Server, lihat http://msdn.microsoft.com/en-au/library/ms179882.aspx
Inti dari ini adalah bahwa semua penjumlahan Anda dapat dilakukan menggunakan aritmatika integer (cepat).
Sebagian besar aplikasi yang pernah saya gunakan digunakan decimal
untuk mewakili uang. Ini didasarkan pada asumsi bahwa aplikasi tidak akan pernah peduli dengan lebih dari satu mata uang.
Asumsi ini mungkin didasarkan pada asumsi lain, bahwa aplikasi tidak akan pernah digunakan di negara lain dengan mata uang yang berbeda. Saya telah melihat kasus yang terbukti salah.
Sekarang asumsi sedang ditantang dengan cara baru: Mata uang baru seperti Bitcoin menjadi lebih umum, dan mereka tidak spesifik untuk negara mana pun. Bukanlah tidak realistis bahwa aplikasi yang digunakan di satu negara saja mungkin masih perlu mendukung banyak mata uang.
Beberapa orang akan mengatakan bahwa membuat atau bahkan menggunakan jenis hanya untuk uang adalah "pelapisan emas," atau menambahkan kompleksitas tambahan di luar persyaratan yang diketahui. Saya sangat tidak setuju. Semakin banyak konsep ada di dalam domain Anda, semakin penting untuk membuat upaya yang masuk akal untuk menggunakan abstraksi yang benar di muka. Jika Anda ingin melihat kerumitan, cobalah bekerja di aplikasi yang dulu digunakan decimal
dan sekarang ada Currency
properti tambahan di sebelah setiap decimal
properti.
Jika Anda menggunakan abstraksi yang salah di muka, menggantinya nanti akan lebih berhasil seratus kali. Itu berarti berpotensi memasukkan cacat ke dalam kode yang ada, dan bagian terbaiknya adalah bahwa cacat itu kemungkinan akan melibatkan jumlah uang, transaksi dengan uang, atau apa pun dengan uang.
Dan tidak sulit untuk menggunakan sesuatu selain desimal. Google "jenis uang nuget" dan Anda akan melihat bahwa banyak pengembang telah membuat abstraksi semacam itu (termasuk saya.) Sangat mudah. Ini semudah menggunakan DateTime
alih-alih menyimpan tanggal dalam sebuah string
.
Buat kelas Anda sendiri. Ini terlihat aneh, tetapi tipe .Net tidak memadai untuk menutup mata uang yang berbeda.