2013-07-04 26 views
13

Tôi đã nhìn thấy đoạn mã này tài chính tính toán tại máy tính của bạn tôi:0.0/0.0 trong C# sẽ không ném "Đã cố gắng chia cho số không."?

double Total = ... 
double Paid = ... 
double Wating_For_Details = ... 
double Decuctibles = ... 
double Rejected = ... 

Vâng, thời điểm tôi thấy điều này, tôi nói với ông rằng double được biểu diễn tại base 2 và có thể KHÔNG đại diện cho tính toán tài chính. sử dụng decimal để thay thế.

tuyệt vời.

Nhưng thời điểm tôi thay đổi nó sẽ tăng gấp đôi Ive gặp phải:

Attempted to divide by zero.

HUH?

Rõ ràng - sử dụng double, khi chia với 0.0KHÔNG ném ngoại lệ:

enter image description here

Nhưng trả NAN.

Trong khi mã của tôi (sử dụng decimal) không ngoại lệ ném (khi Totalzero)

Và vì vậy tôi hỏi:

Tôi đã kiểm tra 0.0==0 và nó trả về true. vậy tại sao tôi không nhận được ngoại lệ nhưng NAN? Tôi biết thats nó nên được như thế nào, nhưng là nơi phổ biến của không ném ngoại lệ khi chia đôi bằng không?

+3

"Tôi đã kiểm tra' 0.0 == 0' "- bạn nghĩ điều gì thực sự được kiểm tra? Các toán hạng ở cả hai mặt là các kiểu không bằng nhau, nhưng một phép chuyển đổi ngầm cho 'int' thành' double' tồn tại - vì vậy những gì bạn thực sự kiểm tra là '0.0 == 0.0'. –

+0

Ngoài ra, câu hỏi của bạn được đặt ra như thể ném một ngoại lệ là * rõ ràng * điều chính xác cần làm trong tình huống này - có rất nhiều thương mại trong thế giới máy tính, và thường không có cách nào "đúng" để làm việc. –

+0

Tương tự như http://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value-types (mặc dù không chính xác trùng lặp) – bigge

Trả lời

5

Xem http://msdn.microsoft.com/en-us/library/system.double.nan.aspx

Một phương pháp hay hành trả về NaN khi kết quả của một hoạt động là không xác định. Ví dụ, kết quả của việc chia zero bằng 0 là NaN, như ví dụ sau đây. (...) Ngoài ra, một cuộc gọi phương thức có giá trị NaN hoặc một phép toán trên giá trị NaN trả về NaN, như ví dụ sau đây.

sau Các mã ví dụ minh họa việc sử dụng NaN:

Double zero = 0; 

    // This condition will return false. 
    if ((0/zero) == Double.NaN) 
    Console.WriteLine("0/0 can be tested with Double.NaN."); 
    else 
    Console.WriteLine("0/0 cannot be tested with Double.NaN; use Double.IsNaN() instead."); 
16

Không giống như hoạt động với các loại không thể thiếu, đó ném ngoại lệ trong trường hợp của tràn hoặc các hoạt động bất hợp pháp như phép chia cho không, hoạt động với các giá trị dấu chấm động không ném ngoại lệ. Thay vào đó, trong tình huống đặc biệt, kết quả của một hoạt động nổi-điểm là zero, dương vô cực, vô cực tiêu cực, hoặc không phải là số (NaN):

From Double on MSDN.

0

Đó là documented:

Một phương pháp hay hành trả về NaN khi kết quả của một hoạt động là không xác định. Ví dụ, kết quả của việc chia zero bằng 0 là NaN.

2

Có một số hành vi đặc biệt của đôi khi chia cho Zero (0.0):

d/0.0 => Double.NaN if d==0.0 
d/0.0 => Double.PositiveInfinity if d>0.0 
d/0.0 => Double.NegativeInfinity if d<0.0 

DivideByZeroException chỉ ném cho Số nguyên (số thập phân là như thế!)

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