Truyền một biến kép thành thập phân


91

Làm thế nào để người ta sử dụng một mã doubleđể decimalphát triển tiền tệ. Đi đâu M?

decimal dtot = (decimal)(doubleTotal);

Câu trả lời:


80

Bạn chỉ sử dụng Mcho 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 Decimalbạ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 Decimaltrướ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.


như một câu hỏi tiếp theo, tại sao cần chuyển đổi rõ ràng? Tôi đã thử và gặp lỗi không thể chuyển một cách rõ ràng một số kép sang một số thập phân, nhưng không phải số thập phân có độ chính xác cao hơn không? (tức là giống như đúc từ một int để một đôi có thể tiềm ẩn.)

4
@Cortana: Độ chính xác của số thập phân cao hơn, nhưng phạm vi nhỏ hơn. Giá trị kép có thể nằm ngoài phạm vi đối với một số thập phân. Xem: stackoverflow.com/questions/7817866/…
Guffa,

39

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 Mhậu tố chữ:

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

Bạn nên sử dụng Mkhi 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.)


28

sử dụng lớp chuyển đổi mặc định: Convert.ToDecimal(Double)


1
Không bởi vì nó sẽ ném ra một double vol_y = (double) OverflowException Decimal.MaxValue + 10E + 28D; Console.WriteLine ("Convert.ToDecimal (vol_y) =" + Convert.ToDecimal (vol_y));
ToXinE

2
@ToXinE IMHO trong hầu hết các trường hợp, OverflowException tốt hơn là âm thầm tạo ra dữ liệu sai
this.myself

16
Convert.ToDecimal(the double you are trying to convert);

2
Tôi đã học được rằng lớp Convert linh hoạt và an toàn hơn nhiều so với một lớp trong C #.
Tom

3
"An toàn"? như khi nó không thể truyền nó ném một ngoại lệ vào lúc chạy thay vì lỗi trình biên dịch? Tôi đã cắn mà rất nhiều lần rằng tôi chủ động tránh Chuyển đổi ...
Peter Ritchie

8
Chủ đề @PeterRitchie hơi cũ nhưng điều này nên nói: Gọi trực tiếp phương thức Convert sẽ là cách tiếp cận phù hợp hơn. Có lẽ tôi chỉ là một người kỳ lạ về tối ưu hóa nhưng một hướng dẫn ít hơn để giải quyết là một phần thưởng (vì sử dụng cú pháp ép kiểu (Loại) rõ ràng chỉ là một quá tải toán tử gọi Convert).
Mike Johnson

1
@PeterRitchie: Từ góc độ ngôn ngữ-thiết kế, sẽ tốt hơn nếu yêu cầu một lập trình viên sử dụng một trong hai phương thức chuyển đổi hơn là cho phép đánh máy từ doubleđến decimal, với điều kiện là doublegiá 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.
supercat

2
@supercat thực sự có vẻ không liên quan đến nhận xét đầu tiên của tôi bởi vì cách sử dụng Convert.ToDecimal(double)giống như (decimal)doubleTotal, ngoại trừ nếu được doubleTotalthay đổ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 ...
Peter Ritchie

1

Đâ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ể doublegiá trị mà tôi muốn chuyển đổi decimalthườ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ệ.


1
Điều này sẽ không thành công trong trường hợp sau double _double = (double) decimal.MaxValue; Tôi sẽ đề nghị sử dụng> = trong so sánh công khai thập phân thập phân ToDecimal (kép này _double) => _double> = (kép) decimal.MaxValue? decimal.MaxValue: (thập phân) _double;
Martin Eyles
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.