2012-03-27 19 views
5

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

+0

Đ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 ..? –

+3

Hãy đăng mã của bạn. Tất cả các biến có nổi không? – c0d3Junk13

+4

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

Trả lời

7

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

+0

+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

+0

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

+0

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

3

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.

+0

Cảm ơn thập phân . – c0ntrol

0

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

1

hãy nhớ rằng hành vi của các điểm nổi có thể khác nhau tùy thuộc vào bộ xử lý bạn đang sử dụng.

Here là một câu hỏi trên diễn đàn này mà những giao dịch với chủ đề

Nếu bạn thực sự muốn thâm nhập vào chủ đề này, here là một nguồn tốt về làm thế nào để kiểm tra hành vi của dấu chấm động

5

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.

Float C# reference

Double C# reference

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

+0

Cảm ơn bạn đã giải thích. – c0ntrol