2015-09-25 20 views
8

Tôi đã đọc trong bài đăng khác nhau trên stackoverflow và trong tài liệu C#, chuyển đổi long (hoặc bất kỳ loại dữ liệu nào khác đại diện cho một số) thành double mất độ chính xác. Điều này khá rõ ràng do sự biểu diễn của các số dấu phẩy động.Độ mất chính xác chuyển đổi từ lâu đến gấp đôi là bao nhiêu?

Câu hỏi của tôi là mất độ chính xác lớn đến mức nào nếu tôi chuyển đổi số lớn hơn thành double? Tôi có phải mong đợi sự khác biệt lớn hơn +/- X không?

Lý do tôi muốn biết điều này, là tôi phải đối phó với bộ đếm liên tục là long. Giá trị này được ứng dụng của tôi đọc là string, cần được truyền và phải được chia cho ví dụ: 10 hoặc một số số nhỏ khác và sau đó được xử lý thêm.

Liệu decimal có phù hợp hơn với nhiệm vụ này không?

+0

Vâng 'decimal' chắc chắn có thể duy trì tất cả thông tin trong một' long' ... nhưng thực sự không rõ yêu cầu của bạn là gì là. –

+0

@JonSkeet thực sự không có, tôi biết làm thế nào để giải quyết nó với số thập phân, nhưng câu hỏi là nhiều hơn hoặc ít hơn sự tò mò. Tôi sẽ cần bao nhiêu lần mất chính xác. – John

Trả lời

8

chuyển đổi long (hoặc bất kỳ loại dữ liệu nào khác đại diện cho một số) thành double mất độ chính xác. Điều này khá rõ ràng do sự biểu diễn của các số dấu phẩy động.

Điều này ít rõ ràng hơn có vẻ như vì mất chính xác phụ thuộc vào giá trị long. Đối với các giá trị nằm trong khoảng từ -2 và 2 thì hoàn toàn không có tổn thất chính xác nào.

Mất độ chính xác lớn như thế nào nếu tôi chuyển đổi số lớn hơn để tăng gấp đôi? Tôi có phải mong đợi sự khác biệt lớn hơn +/- X

Đối với số với cường độ trên 2 bạn sẽ trải nghiệm một số mất mát chính xác, tùy thuộc vào bao nhiêu vượt quá giới hạn 52-bit bạn đi.Nếu giá trị tuyệt đối của số long của bạn phù hợp với, ví dụ, 58 bit, thì độ lớn mất chính xác của bạn sẽ là 58-52 = 6 bit hoặc +/- 64.

Có phải decimal thích hợp hơn cho tác vụ này không?

decimal có một đại diện khác với double và nó sử dụng cơ sở khác. Vì bạn đang lập kế hoạch chia số của mình cho "số nhỏ", các biểu diễn khác nhau sẽ cho bạn các lỗi khác nhau về phân chia. Cụ thể, double sẽ tốt hơn trong việc xử lý chia theo quyền hạn của hai (2, 4, 8, 16, v.v.) vì việc phân chia đó có thể được thực hiện bằng cách trừ đi số mũ, mà không chạm vào phần định trị. Tương tự, số lớn decimal s sẽ không bị mất các chữ số có nghĩa khi chia cho mười, trăm, v.v.

+0

Hoàn hảo! Tôi nghĩ rằng tính toán này sẽ cho tôi sự mất mát chính xác nhưng không chắc chắn. Sự mất mát thực sự nhỏ hơn tôi mong đợi. Cảm ơn! – John

3

long

long là một loại số nguyên 64-bit và có thể giữ giá trị từ -9.223.372.036.854.775.808 để 9,223,372,036,854,775,807 (max. 19 chữ số).

double

double là 64-bit kiểu dấu chấm động có độ chính xác từ 15 đến 16 chữ số. Vì vậy, dữ liệu chắc chắn có thể bị mất trong trường hợp số của bạn lớn hơn ~ 100,000.000.000.000.

decimal

decimal là một loại thập phân 128-bit và có thể chứa lên đến 28-29 chữ số. Vì vậy, luôn an toàn khi truyền long đến decimal.

Đề xuất

Tôi khuyên bạn nên tìm ra kỳ vọng chính xác về số liệu bạn sẽ làm việc. Sau đó, bạn có thể đưa ra quyết định sáng suốt trong việc chọn loại dữ liệu thích hợp. Vì bạn đang đọc các số của bạn từ một chuỗi, không phải là có thể chúng sẽ lớn hơn 28 chữ số? Trong trường hợp đó, không có loại nào được liệt kê sẽ làm việc cho bạn, và thay vào đó bạn sẽ phải sử dụng một số loại triển khai BigInt.

+0

Chắc chắn rằng nó sẽ không vượt quá phạm vi dài. Cảm ơn câu trả lời! – John

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