2010-04-30 30 views
7

Tôi đã đi qua một vấn đề chính xác với đôi trong NET. Tôi nghĩ rằng điều này chỉ áp dụng cho phao nhưng bây giờ tôi thấy rằng đôi là một phao.đôi trừ đôi cho vấn đề chính xác

double test = 278.97 - 90.46; 
Debug.WriteLine(test) //188.51000000000005 

//correct answer is 188.51 

Cách chính xác để xử lý việc này là gì? Tròn? Lop ra những nơi thập phân không cần thiết?

+0

Bạn sử dụng những cặp đôi này để làm gì? Nếu cho các giá trị tiền tệ ví dụ Bạn phải sử dụng loại khác. –

+0

Vâng, đó là tiền. – Alistair

+0

Trong trường hợp đó, hãy nghe Michael. Đôi sẽ cắn bạn. –

Trả lời

8

Sử dụng loại dữ liệu decimal. "Loại giá trị thập phân phù hợp cho các phép tính tài chính đòi hỏi số lượng lớn các chữ số nguyên và số nguyên phân tách đáng kể và không có lỗi vòng tròn."

+0

+1 Nếu bạn đang làm công cụ tài chính, bạn * thực sự * cần phải sử dụng 'thập phân'. –

+1

Thập phân là loại dữ liệu chính xác bạn nên sử dụng để tính toán tài chính. Nó không loại bỏ nhu cầu làm tròn nhưng giảm thiểu lỗi do làm tròn. –

+0

Cảm ơn. Điều này đã khắc phục được sự cố của tôi. – Alistair

4

Điều này xảy ra ở nhiều ngôn ngữ và bắt nguồn từ thực tế là chúng tôi không thể thường lưu trữ đôi hoặc nổi chính xác trong phần cứng kỹ thuật số. Để có giải thích chi tiết về cách tăng gấp đôi, nổi và tất cả các giá trị dấu phẩy động khác thường được lưu trữ, hãy xem các thông số kỹ thuật IEEE khác nhau được mô tả trên wikipedia. Ví dụ: http://en.wikipedia.org/wiki/Double_precision

Tất nhiên có các định dạng khác, chẳng hạn như định dạng điểm cố định. Nhưng sự thiếu chính xác này ở hầu hết các ngôn ngữ và tại sao bạn thường cần sử dụng các bài kiểm tra epsilon thay vì kiểm tra bình đẳng khi sử dụng gấp đôi trong điều kiện (ví dụ: abs (x - y) < = 0,0001 thay vì x == y).

Cách bạn đối phó với sự thiếu chính xác này tùy thuộc vào bạn và tùy thuộc vào đơn đăng ký của bạn.

Các vấn đề liên quan