2015-04-22 25 views
5

Bất kỳ ai có thể cho tôi biết tại sao câu sau đây đánh giá sai?C# hành vi kỳ lạ với + nhà điều hành

bool myBoolean = .6 + .3 + .1 == .1 + .3 + .6; // false 

Điều tương tự trong Javascript và C++.

+1

Số học dấu chấm động? –

+0

Như một lưu ý, thử nghiệm cho bình đẳng nổi sau khi bất kỳ số học thường là một ý tưởng tồi – Sebi

+1

Sử dụng đúng loại 'thập phân':' bool myBoolean = .6m + .3m + .1m == .1m + .3m + .6m; ' –

Trả lời

7

Nb. Tôi trả lời câu hỏi này vì nó cũng được gắn thẻ C++

Do lỗi đại diện nổi, trong C++, giá trị trên sai vì hai số phao không hoàn toàn bằng nhau.

Ví dụ: đại diện nội bộ cho 0,1 là gần với giá trị đó, nhưng không chính xác nó

enter image description here

Cùng giữ cho C#.

Cho phép tôi để liên kết một văn bản nổi tiếng đó (IMHO) mỗi lập trình viên đối phó với dấu chấm động số học nên đọc: What Every Computer Scientist Should Know About Floating-Point Arithmetic

0

] Không bao giờ tin tưởng vào Floating-Point Arithmetic. Trong quá trình chuyển đổi, bạn có thể bị mất precison. Đó là lý do tại sao kết quả là sai. Tôi khuyên bạn nên thử sử dụng kiểu thập phân để lưu trữ số theo ký hiệu thập phân. Vì vậy, số của bạn sẽ được đại diện chính xác.

enter image description here