Bạn có vẻ như đang ở chỗ với lợi ích của việc sử dụng loại dấu phẩy động. Tôi có xu hướng thiết kế cho số thập phân trong mọi trường hợp, và dựa vào một profiler để cho tôi biết nếu hoạt động trên thập phân gây ra tắc nghẽn hoặc chậm lại. Trong những trường hợp đó, tôi sẽ "xuống" để tăng gấp đôi hoặc trôi nổi, nhưng chỉ thực hiện nội bộ và cẩn thận cố gắng quản lý tổn thất chính xác bằng cách giới hạn số chữ số có nghĩa trong hoạt động toán học đang được thực hiện.
Nói chung, nếu giá trị của bạn là tạm thời (không được sử dụng lại), bạn an toàn để sử dụng loại dấu phẩy động. Vấn đề thực sự với các loại dấu phẩy động là ba kịch bản sau đây.
- Bạn đang tập hợp các giá trị dấu chấm động (trong trường hợp các hợp chất lỗi chính xác mà)
- Bạn xây dựng các giá trị dựa trên giá trị dấu chấm động (ví dụ như trong một thuật toán đệ quy)
- Bạn đang làm toán với một số lượng rất lớn các chữ số có nghĩa (ví dụ,
123456789.1 * .000000000000000987654321
)
EDIT
Một ccording đến reference documentation on C# decimals:
Các thập phân từ khóa biểu thị một 128-bit kiểu dữ liệu . So với loại dấu phẩy động, loại thập phân có độ chính xác cao hơn và phạm vi nhỏ hơn, điều này làm cho nó phù hợp với các tính toán tài chính và tiền tệ .
Vì vậy, để làm rõ tuyên bố trên của tôi:
tôi có xu hướng để thiết kế cho số thập phân trong tất cả các trường hợp, và dựa vào một hồ sơ để cho tôi biết nếu hoạt động trên thập phân là tắc nghẽn gây ra hoặc chậm -trước.
Tôi chỉ từng làm việc trong các ngành có số thập phân thuận lợi. Nếu bạn đang nghiên cứu về các công cụ đồ họa hoặc phương pháp đồ họa, nó có thể mang lại nhiều lợi ích hơn cho thiết kế cho một loại điểm nổi (float hoặc double).
Decimal là không hoàn toàn chính xác (nó là không thể để đại diện cho chính xác vô hạn cho người không thể thiếu trong một kiểu dữ liệu cơ bản), nhưng nó là xa hơn chính xác hơn gấp đôi:
- thập phân = 28-29 chữ số có nghĩa
- đôi = 15-16 chữ số có nghĩa
- float = 7 chữ số có nghĩa
EDIT 2
Để trả lời nhận xét của Konrad Rudolph, mụC# 1 (ở trên) chắc chắn là chính xác. Sự tổng hợp của sự thiếu chính xác thực sự hợp chất. Xem mã dưới đây để biết một ví dụ:
private const float THREE_FIFTHS = 3f/5f;
private const int ONE_MILLION = 1000000;
public static void Main(string[] args)
{
Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10"));
float asSingle = 0f;
double asDouble = 0d;
decimal asDecimal = 0M;
for (int i = 0; i < ONE_MILLION; i++)
{
asSingle += THREE_FIFTHS;
asDouble += THREE_FIFTHS;
asDecimal += (decimal) THREE_FIFTHS;
}
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION);
Console.WriteLine("Single: {0}", asSingle.ToString("F10"));
Console.WriteLine("Double: {0}", asDouble.ToString("F10"));
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10"));
Console.ReadLine();
}
này kết quả đầu ra như sau:
Three Fifths: 0.6000000000
Six Hundred Thousand: 600000.0000000000
Single: 599093.4000000000
Double: 599999.9999886850
Decimal: 600000.0000000000
Như bạn có thể thấy, mặc dù chúng tôi đang bổ sung thêm từ cùng một nguồn liên tục, kết quả của các đôi là ít chính xác (mặc dù có thể sẽ làm tròn chính xác), và phao chính xác hơn rất nhiều, đến mức nó chỉ được giảm xuống còn hai chữ số có nghĩa.
cũng xem http://stackoverflow.com/questions/2545567/in-net-how-do-i-choose-between-a-decimal-and-a-double –
Điều này được thăng hạng khá thường xuyên và tôi vẫn đang gặp khó khăn với nó. Ví dụ, tôi đang làm việc trên một ứng dụng mà tính toán tài chính vì vậy tôi đang sử dụng thập phân trong suốt. Nhưng các hàm toán học và VisualBasic.Financial sử dụng gấp đôi nên có rất nhiều chuyển đổi mà tôi liên tục đoán lần thứ hai về việc sử dụng số thập phân. –
@JamieIde thật điên rồ các chức năng Tài chính sử dụng gấp đôi, tiền phải luôn ở dạng thập phân. –