2009-04-20 30 views
8

Tôi có chuỗi này "1.79769313486232E + 308" và đang cố gắng chuyển đổi nó thành giá trị số .NET (gấp đôi?) Nhưng tôi nhận được ngoại lệ dưới đây. Tôi đang sử dụng Convert.ToDouble(). Cách thích hợp để thực hiện chuyển đổi này là gì?Chuyển đổi "1.79769313486232E + 308" thành gấp đôi mà không có OverflowException?

OverflowException: Giá trị là một trong hai quá lớn hoặc quá nhỏ so với một đúp

Trả lời

11

Sự cố có thể do thực tế là Double.MaxValue đã được chuyển đổi thành chuỗi và khi chuỗi là đầu ra, không phải tất cả các chữ số đều là đầu ra, thay vào đó là số được làm tròn. Phân tích cú pháp giá trị này tràn gấp đôi.

Sử dụng Double.TryParse và sau đó kiểm tra bình đẳng về chuỗi "1.79769313486232E + 308" trong trường hợp thất bại và thay Double.MaxValue phải là một cách giải quyết nhanh chóng, nếu bạn cần phải giữ cho chuỗi cách nó được.

CHỈNH SỬA: Tất nhiên, nếu bạn không cần giữ chuỗi như trước, hãy sử dụng Round Trip format specifier để tạo chuỗi ở địa điểm đầu tiên, dưới dạng Jon describes in his answer.

1

Bạn có thể thử double.Parse() hoặc double.TryParse() hơn Convert.ToDouble(), nhưng tôi không chắc chắn bạn sẽ nhận được kết quả tốt hơn. Ngẫu nhiên, chuỗi mà bạn cung cấp bằng double.MaxValue, đó là (tất nhiên) giá trị tối đa có thể được chứa trong một đôi, do đó, đó là khả năng mà lỗi của bạn đến từ đó. Các kiểu số dấu chấm động là khó tính, vì vậy tôi giả định rằng một số loại làm tròn đang diễn ra và đẩy nó ra ngoài giới hạn của kiểu.

Bạn cũng có thể thử loại dữ liệu decimal. Bạn có thể có may mắn hơn ở đó.

+1

Hoặc chỉ cần sử dụng double.MaxValue trực tiếp? Hoặc thực hiện kiểm tra chuỗi cho chuỗi cụ thể đó và thay thế double.MaxValue, vì nó rõ ràng là một trường hợp đặc biệt. – gbarry

+1

Thập phân sẽ không hoạt động chút nào. Decimal.MaxValue codekaizen

-2

Số đó quá lớn đối với một đôi, như ngoại lệ cho biết. Bạn sẽ phải tìm một thư viện số lớn để xử lý nó cho bạn, vì không có gì mà tôi biết trong thư viện .Net xử lý các số rất lớn.

21

Rất tiếc, giá trị này lớn hơn double.MaxValue, do đó ngoại lệ.

Như mãkaizen gợi ý, bạn có thể kiểm tra mã cứng cho chuỗi. Giải pháp thay thế tốt hơn (IMO) nếu bạn là một trong số sản xuất chuỗi ở địa điểm đầu tiên là sử dụng trình định dạng định dạng "r". Sau đó, chuỗi bạn tạo ra sẽ là "1.7976931348623157E + 308" thay vào đó, sau đó phân tích một cách chính xác:

string s = double.MaxValue.ToString("r"); 
double d = double.Parse(s); // No exception 

Rõ ràng đó là không có sự giúp đỡ nếu bạn không có quyền kiểm soát dữ liệu - nhưng sau đó bạn nên hiểu bạn có khả năng mất dữ liệu trong trường hợp đó.

+1

+1 để đề cập đến thông số định dạng vòng lặp "r". –

1

Đây là những gì tôi nghĩ ra. Cảm ơn Jon Skeet và codekaizen.

private double convertToDouble(string str) 
{ 
    double dbl; 

    if (double.TryParse(str, out dbl)) 
     return dbl; 

    if (str == "1.79769313486232E+308") 
     return double.MaxValue; 

    return double.MinValue; 
} 
1

Chứng minh vấn đề và một giải pháp:

var s = double.MaxValue.ToString(); 
double d; 
if (!double.TryParse(s, out d)) { 
    d = s.Equals(double.MaxValue) ? double.MaxValue : double.MinValue; 
} 
Các vấn đề liên quan