Câu trả lời:
Bạn chỉ sử dụng M
cho một ký tự số, khi bạn truyền nó chỉ:
decimal dtot = (decimal)doubleTotal;
Lưu ý rằng số dấu phẩy động không phù hợp để giữ một giá trị chính xác, vì vậy nếu lần đầu tiên bạn thêm các số lại với nhau và sau đó chuyển đổi thành Decimal
bạn có thể gặp lỗi làm tròn. Bạn có thể muốn chuyển đổi các số thành Decimal
trước khi cộng chúng lại với nhau hoặc đảm bảo rằng các số đó không phải là số dấu phẩy động ngay từ đầu.
Bạn có thể truyền một số kép thành một số thập phân như thế này, mà không cần M
hậu tố chữ:
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Bạn nên sử dụng M
khi khai báo một giá trị thập phân theo nghĩa đen mới:
decimal dec = 123.45M;
(Nếu không có M
, 123.45 được coi là một kép và sẽ không biên dịch.)
sử dụng lớp chuyển đổi mặc định: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
đến decimal
, với điều kiện là double
giá trị như (1000000.0 / 3.0) thì trong một số trường hợp, nó sẽ muốn cắt độ chính xác "vượt quá" tạo ra 333333.333333333D, nhưng trong những trường hợp khác, người ta muốn giữ lại nó, tạo ra 333333.333333333313931D. Thay vì chỉ nói "chuyển đổi thành số thập phân", mã phải chỉ định cách chuyển đổi đó sẽ được thực hiện.
Convert.ToDecimal(double)
giống như (decimal)doubleTotal
, ngoại trừ nếu được doubleTotal
thay đổi thành một loại khác, bạn có thể tránh lỗi thời gian biên dịch và tạo ra lỗi thời gian chạy khó tìm hơn vì một ToDecimal khác ghi đè có thể được gọi. Điều hành viên diễn viên rõ ràng hơn nhiều ...
Đây là một câu hỏi cũ và tôi thực sự đã sử dụng một số câu trả lời được hiển thị ở đây. Tuy nhiên, trong tình huống cụ thể của tôi, có thể double
giá trị mà tôi muốn chuyển đổi decimal
thường lớn hơn decimal.MaxValue
. Vì vậy, thay vì xử lý các ngoại lệ, tôi đã viết phương thức mở rộng này:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
Cách tiếp cận trên hoạt động nếu bạn không muốn bận tâm đến việc xử lý các ngoại lệ tràn và nếu điều như vậy xảy ra, bạn chỉ muốn giữ giá trị tối đa có thể (trường hợp của tôi), nhưng tôi biết rằng đối với nhiều trường hợp khác, đây sẽ không phải là hành vi mong đợi và có thể cần xử lý ngoại lệ.