Tôi là người mới bắt đầu trong C# và tôi đang làm việc với các số dấu phẩy động. Tôi cần phải làm phép trừ giữa hai số này nhưng nó không hoạt động. Tôi biết nó được gây ra bởi số điểm nổi, nhưng làm thế nào tôi có thể sửa chữa nó xin vui lòng và nếu bạn được như vậy tốt, bạn có thể giải thích cho tôi tại sao nó xảy ra? Cảm ơn trước.C# trừ sai? 12.345 - 12 = 0.345000000000001
Trả lời
Xem xét sử dụng số thập phân thay vì float:
// Instead of this...
float a = 12.345F;
float b = 12;
float c = a - b;
// Use this:
decimal d = 12.345M;
decimal e = 12;
decimal f = d - e;
Jon Skeet đưa ra một lời giải thích tốt về những khác biệt giữa hai loại trong câu trả lời này: https://stackoverflow.com/a/618596/446681
+1: nếu bạn cần bất kỳ loại độ trung thực số nào, thì 'thập phân' là cách để đi. – code4life
Thập phân là những gì tôi đang tìm kiếm, cảm ơn rất nhiều. Tôi cũng muốn cảm ơn những người đã giải thích tại sao nó lại xảy ra. – c0ntrol
Phụ thuộc vào những gì các con số cho. Bạn nên luôn sử dụng 'thập phân' để kiếm tiền. Nhưng * không * cho mô phỏng vật lý. – dan04
Bạn tính chính xác như thế nào?
float a = 12.35F;
float b = 12.0F;
float ans = a - b; //0.350000381
double x = 12.35;
double y = 12.0;
double ans2 = x - y; //0.34999999999999964
decimal n = 12.35m;
decimal m = 12.0m;
decimal ans3 = n - m; //0.35
Đối với tôi những tính toán này cho kết quả chính xác.
Cảm ơn thập phân . – c0ntrol
Tùy thuộc vào những gì bạn có thể sử dụng một trong hai loại thập phân, hoặc lưu trữ như cũ, nhưng tròn trước khi hiển thị câu trả lời
này không phải là vấn đề aC#, đây là vấn đề khoa học máy tính. Nếu bạn muốn thực sự hiểu những gì đang diễn ra, hãy đọc What Every Computer Scientist Should Know About Floating-Point Arithmetic. Nếu bạn chỉ quan tâm đến lý do tại sao bạn gặp vấn đề, đó là vì Float và Double chỉ chính xác đến 7 và 15 chữ số tương ứng trên nền tảng này, và bạn cần áp dụng logic làm tròn để đạt được kết quả mà bạn đang tìm kiếm.
Nặn vô cùng nhiều số thực thành một số hữu hạn các bit yêu cầu một đại diện tương đối. Mặc dù có vô số nhiều số nguyên, trong hầu hết các chương trình, kết quả tính toán số nguyên có thể được lưu trữ trong 32 bit. Ngược lại, với số bit cố định, hầu hết các phép tính với số thực sẽ tạo ra số lượng không thể được biểu diễn chính xác bằng cách sử dụng nhiều bit đó. Do đó, kết quả của phép tính dấu phẩy động thường phải được làm tròn theo thứ tự để phù hợp với biểu diễn hữu hạn của nó. Lỗi làm tròn này là tính năng đặc trưng tính toán dấu phẩy động. Goldberg 1991
Cảm ơn bạn đã giải thích. – c0ntrol
Điều bạn muốn và vấn đề của bạn là gì, hãy giải thích câu hỏi của bạn ..? –
Hãy đăng mã của bạn. Tất cả các biến có nổi không? – c0d3Junk13
Bạn có thể đăng mã không? Tính toán trong chủ đề của bạn trông rất lạ. Vòng tròn điểm nổi bình thường không gây ra hành vi như vậy. – CodesInChaos