2009-02-17 33 views
29

Tôi đã đoạn mã sau ...bình đẳng với Double.NaN

if (Price_Foreign != Double.NaN) 
{ 
    output.Append(spacer); 
    output.Append(String.Format("{0,-10:C} USD",Price_Foreign)); 
} 

Những kết quả đầu ra:

NaN USD 

gì cho?

Tôi đang sử dụng Double.NaN để cho biết giá trị không tồn tại và không được xuất.

+2

không sử dụng đôi cho giá! – tgamblin

+0

Không quan trọng. - Tôi bị mắc kẹt với một định dạng cơ sở dữ liệu có giá gấp đôi. Tôi đã làm việc ra làm tròn. Nó không phải là quá xấu, vì tôi không làm bất kỳ hoạt động nhạy cảm nặng nề epsilon. Tuy nhiên, tôi đã thiết kế DB khác nhau. –

+1

bạn có nghĩ đến việc chuyển đổi các cặp đôi được trả lại từ cơ sở dữ liệu sang loại thích hợp hơn trong cơ hội sớm nhất không? theo cách này, hệ thống của bạn có thể sử dụng loại tốt nhất có sẵn trong quá trình xử lý, bất kể hệ thống bên ngoài (cơ sở dữ liệu) xảy ra như thế nào để lưu trữ chúng –

Trả lời

52

Có lẽ bạn đang tìm kiếm chức năng tĩnh IsNaN?

Hãy thử một cái gì đó như thế này:

if (!Double.IsNaN(Price_Foreign)) 
{ 
    output.Append(spacer); 
    output.Append(String.Format("{0,-10:C} USD",Price_Foreign)); 
} 
+0

Yup, đã làm điều đó. –

27

Các IEEE 754 floating point standard bang mà so sánh với NaN NaN sẽ luôn trở lại sai. Nếu bạn phải làm điều này, hãy sử dụng Double.isNaN().

Nhưng, đây không phải là cách tốt nhất để làm những gì bạn đang cố gắng làm. Đôi là KHÔNG chính xác, và bạn đang sử dụng chúng để đại diện cho giá ở đây. Tôi cá cược rằng tại một số điểm, bạn sẽ muốn so sánh giá cả cho sự bình đẳng, quá. Điều đó sẽ không hoạt động, bởi vì you can't rely on floating point equality.

Bạn thực sự nên xem xét sử dụng một số loại số nguyên cho các giá trị này (hỗ trợ so sánh bình đẳng) thay vì cố gắng sử dụng tăng gấp đôi. Tăng gấp đôi cho các vấn đề khoa học; không dành cho tài chính.

+0

Xem nhận xét về câu hỏi gốc. - Tôi đang mắc kẹt với một cơ sở dữ liệu hiện có từ năm trở lại. –

8

Double.NaN không bằng bất kỳ thứ gì, thậm chí không phải chính nó.

Xem Double.NaN Field trong tài liệu .NET Framework Class Library:

Sử dụng IsNaN để xác định xem một giá trị không phải là số. Không thể xác định xem giá trị có phải là số hay không bằng cách so sánh giá trị này với một giá trị khác bằng NaN.

+1

Trừ khi bạn sử dụng '.Equals'! – NetMage

9

Như thông tin cơ bản: những gì các phương pháp IsNaN() làm là return v != v;

+0

No. Xem [Nguồn tham khảo] (https://referencesource.microsoft.com/#mscorlib/system/double.cs,b3843db5f359a0fd) – Wizou