2009-01-04 39 views
7

Ai đó có thể giải thích tại sao int (0.4 * 10.0)4 chưa int ((2.4 - 2.0) * 10.0)3?Chuyển đổi phao sang int trong F #

Và sau đó, vui lòng giải thích cách nhận 4. tức là tôi có thực sự phải làm int (System.Math.Round((2.4 - 2.0) * 10.0)) không?

Nó quá xấu xí đối với một thứ đơn giản.

+2

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

Trả lời

11

Biểu thị kép 2,4 - 2,0 là 0,399999999999. Khi bạn chuyển đổi một số thành phần thập phân được cắt ngắn để 3.999999999 được cắt ngắn thành 3.

+1

Đúng vậy, nếu bạn muốn nhận được 4.0 thì bạn có thể sử dụng Math.Round: Math.Round ((2.4 - 2.0) * 10.0) – Robert

1

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.

5

Và sau đó cũng xin giải thích như thế nào để có được 4. tức là Tôi thực sự phải làm

int (System.Math.Round ((2,4 - 2,0) * 10,0))

nó chỉ thật xấu xí cho một thứ đơn giản.

Tất nhiên là không, chỉ cần xác định

let round x = int System.Math.Round(x) 
4

Trên thực tế, trong Net có một loại decimal dữ liệu đó sẽ giúp bạn với vấn đề này, nếu số của bạn có thể được biểu diễn chính xác như phân số thập phân.

2.4m - 2.0m == 0.4m 
2.4 - 2.0 != 0.4 
2

Để bí mật một số float đến việc sử dụng int:

let i = Convert.ToInt32(f)

+0

Chỉ cần một lưu ý cho người dùng mới (như tôi): cần 'mở System' trước – sebhofer

Các vấn đề liên quan