Khi chia kết quả trong một số lặp vô hạn, con số rõ ràng bị cắt ngắn để vừa với kích thước của số thập phân. Vì vậy, một cái gì đó như 1/3 trở thành một cái gì đó như 0.3333333333333333333. Nếu sau đó chúng ta nhân số đó với 3, chúng ta sẽ nhận được một cái gì đó như 0.999999999999999999 thay vì 1 như chúng ta sẽ nhận được nếu giá trị thực sự của phân số đã được bảo tồn.Làm thế nào để đối phó với các số lặp vô hạn như số thập phân?
Đây là một mẫu mã này từ bài viết MSDN về số thập phân:
decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
Điều này gây ra một vấn đề khi giá trị 0,9999999999999999999 được so sánh với 1 đối với bình đẳng. Nếu không có sự mất chính xác, chúng sẽ bằng nhau, nhưng tất nhiên trong trường hợp này sự so sánh sẽ dẫn đến sai.
Mọi người thường giải quyết vấn đề này như thế nào? Có một giải pháp thanh lịch hơn khác ngoài việc xác định một số sai sót của lỗi đối với mọi so sánh?
@nathanhayfield Có vẻ như bạn đã bỏ lỡ câu cuối cùng của câu hỏi. –
Tuy nhiên, đó là * cách tổng quát để thực hiện nó, hoặc tại chỗ, hoặc với một hàm có lề bên trong nó hoặc cho phép bạn chỉ định một (điều đó sẽ thanh lịch hơn về khả năng đọc, nhưng cùng một khái niệm).(Đừng quên nếu bạn đang bao giờ hiển thị kết quả cho người dùng, cũng tròn nổi để một cái gì đó có thể đọc được. Không ai muốn thấy rằng họ nợ $ 1.99999999999. Có, tôi đã nhìn thấy điều này. Nhiều lần.) – neminem
Đó là một cũ và được biết đến vấn đề trong số tính toán –