2011-09-22 24 views
20

thể trùng lặp:
Why doesn't Math.Round/Floor/Ceiling return long or int?lý do tại sao math.Ceiling (double a) không trả về int trực tiếp?

MSDN định nghĩa phương pháp này: Trả về nhỏ nhất nguyên lớn hơn hoặc bằng với đôi chính xác số dấu chấm động quy định.

nhưng trên thực tế, nó là

public static double Ceiling (
    double a 
) 

tại sao không trở về int trực tiếp? những gì hiện microsoft nghĩ đến?

Trả lời

43

Đó là bởi vì phạm vi của một double (± 5,0 × 10 -324 đến ± 1,7 × 10) lớn hơn nhiều so với phạm vi của một int (-2147483648 đến 2,147,483,647). Nếu kiểu trả về là int nhiều đầu vào có thể bị lỗi. Ví dụ: Math.Ceiling có thể bị buộc phải ném OverflowException trong ngữ cảnh checked hoặc thậm chí có thể trả lại kết quả không chính xác trong ngữ cảnh không được kiểm soát. Đây là hành vi không mong muốn.

Cũng có thể trả về một số giá trị đặc biệt như NaNPositiveInfinity bằng phương pháp này. Điều này chỉ có thể xảy ra nếu kiểu trả về là double.

Nếu bạn tin rằng kết quả sẽ phù hợp với một int, bạn có thể thêm một diễn viên rõ ràng:

int result = (int)Math.Ceiling(a); 
+0

Và tất nhiên, nếu bạn làm một diễn viên rõ ràng giống như ví dụ rằng, nếu giá trị * không * phù hợp, thời gian chạy sẽ ném một phù hợp (và bạn nhận được ngoại lệ để đối phó với). –

+0

Thật ngớ ngẩn: đôi khi chỉ có thể lưu trữ đáng kể ~ 7-8 con số đáng kể, vì vậy bạn sẽ không thể làm tròn bất cứ thứ gì cao hơn '2147483648'. –

+1

@ ChrisBurt-Brown: Một 'double' có thể giữ mọi bội số của một nửa lên đến 2^52, lớn hơn đáng kể so với phạm vi 2^31 của' Int32' (nhưng nhỏ hơn 2^63 của một ' Int64'). – supercat

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