2012-07-03 31 views
5

Tôi có một lớp có thuộc tính thập phân & Tôi đang tuần tự hóa & deserializing bằng JSON.NET. Vấn đề tôi gặp phải là nếu nói giá trị thập phân là 100000000000023063.0, khi tôi deserialize nó được chuyển đổi thành 100000000000023000. Tôi đã kiểm tra JSON & nó chắc chắn được ghi lại là 100000000000023063.0..NET/C# serial serialization problems

Tôi đã nhìn vào nó &

decimal.Parse("100000000000023063.0") 

=

100000000000023063.0 

nhưng

var d = (decimal)100000000000023063.0 

=

100000000000023000 

Tôi có thể giải quyết vấn đề này bằng cách lưu trữ dưới dạng chuỗi & có thuộc tính có dạng thập phân.Parse() nhưng có ai biết tại sao điều này xảy ra không?

Trả lời

12

Đó là vì 100000000000023063.0 là hằng số double, sau đó bạn chuyển đổi thành decimal và độ chính xác bị mất.

Viết nó như thay vì điều này:

var d = 100000000000023063.0M; 

Các M hậu tố kể trình biên dịch C# rằng số lượng là một hằng số decimal.

Trong thực tế, bạn thậm chí không cần dấu tách thập phân cho điều này - tức là 1M == 1.0M và cả hai là decimal s.

+0

Cảm ơn rất nhiều cho điều đó. Tôi nhận được giá trị "100000000000023063.0" trong XML thông qua dịch vụ web. Sau đó tôi phân tích nó và tạo lớp học của tôi và sắp xếp lớp học bằng cách sử dụng JSON.NET và lưu nó trong cơ sở dữ liệu để tham khảo trong tương lai. Có vẻ như JSON.NET 4.0 khắc phục sự cố với độ chính xác thập phân. – LozzaDude

1

Đó là bởi vì bạn đang đúc một đôi đến một số thập phân trong khi bạn nên xác định giá trị như một số thập phân: tức là

var q = 100000000000023063.0M; 

M hậu tố chỉ ra rằng hằng số là loại Decimal