Bagaimana satu gips double
untuk decimal
yang digunakan ketika melakukan pengembangan mata uang. Kemana perginya M
?
decimal dtot = (decimal)(doubleTotal);
Jawaban:
Anda hanya menggunakan M
untuk literal numerik, saat Anda mentransmisikannya hanya:
decimal dtot = (decimal)doubleTotal;
Perhatikan bahwa bilangan floating point tidak cocok untuk menyimpan nilai pasti, jadi jika Anda menambahkan angka terlebih dahulu dan kemudian mengubahnya menjadi Decimal
Anda mungkin mendapatkan kesalahan pembulatan. Anda mungkin ingin mengonversi angka menjadi Decimal
sebelum menambahkannya bersama-sama, atau pastikan bahwa angka tersebut bukan angka floating point sejak awal.
Anda dapat mengubah dua kali lipat menjadi desimal seperti ini, tanpa memerlukan M
akhiran literal:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Anda harus menggunakan M
saat mendeklarasikan nilai desimal literal baru:
decimal dec = 123.45M;
(Tanpa M
, 123.45 diperlakukan sebagai ganda dan tidak akan dikompilasi.)
gunakan kelas konversi default: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
to decimal
, mengingat double
nilai seperti (1000000.0 / 3.0) dalam beberapa kasus ingin memotong presisi "berlebih" yang menghasilkan 333333.333333333D, tetapi dalam kasus lain seseorang ingin mempertahankannya, menghasilkan 333333.333333333313931D. Daripada hanya mengatakan "ubah ke desimal", kode harus menentukan bagaimana konversi itu harus dilakukan.
Convert.ToDecimal(double)
sama dengan (decimal)doubleTotal
, kecuali jika doubleTotal
diubah ke jenis yang berbeda Anda mungkin akan menghindari kesalahan waktu kompilasi dan memperkenalkan kesalahan waktu proses yang lebih sulit ditemukan karena ToDecimal yang berbeda override mungkin dipanggil. Operator pemeran jauh lebih eksplisit ...
Ini adalah pertanyaan lama dan saya benar-benar memanfaatkan beberapa jawaban yang ditampilkan di sini. Namun demikian, dalam skenario khusus saya, mungkin saja double
nilai yang ingin saya ubah decimal
sering lebih besar dari decimal.MaxValue
. Jadi, alih-alih menangani pengecualian, saya menulis metode ekstensi ini:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
Pendekatan di atas berfungsi jika Anda tidak ingin repot menangani pengecualian luapan dan jika hal seperti itu terjadi, Anda hanya ingin mempertahankan nilai maksimal yang mungkin (kasus saya), tetapi saya sadar bahwa untuk banyak skenario lain ini bukan perilaku yang diharapkan dan mungkin penanganan pengecualian akan dibutuhkan.