Số dấu chấm động không phải là độ chính xác vô hạn. Một số số có thể được biểu diễn một cách hoàn hảo (bất kỳ thứ gì liên quan đến lũy thừa của hai, ví dụ 1, 1/2 = 0.5, 1/4 = 0.25, v.v.) và một số khác không thể (ví dụ 1/3 không thể phân tách chính xác thành chuỗi hữu hạn) quyền hạn của hai). Thông thường, cắt phần cuối của chuỗi vô hạn làm cho phiên bản được mã hóa của một số nhỏ hơn một chút so với giá trị thực của nó.
Kết hợp điều này với một thực tế là (int) điều hành truncates chứ không phải là viên đạn, và bạn có thể chạy vào trường hợp một hoạt động mà nên mang lại kết quả trong 4,0 3,999999999991 thay vào đó, mà trở thành 3.
Bất cứ lúc nào bạn đang cố gắng chuyển đổi float/double thành ints, bạn muốn suy nghĩ cẩn thận về toán tử nào bạn muốn sử dụng - cắt bớt (làm tròn), làm tròn lên, hoặc làm tròn đến gần nhất.
Vì đây là vấn đề với biểu diễn dấu phẩy động, điều này đúng không chỉ trong F #, nhưng C# và (IIRC) Java và các ngôn ngữ khác.
Nguồn
2009-01-04 16:52:34
Cần lưu ý rằng đây không phải là một chiếc F # cụ thể "vấn đề", nhưng thay vì về bản chất của hầu hết các ngôn ngữ, tại ít nhất là tất cả .NET. –