Gần đây, tôi đã gặp một lỗi/tính năng bằng nhiều ngôn ngữ. Tôi có một kiến thức rất cơ bản về cách nó gây ra (và tôi muốn giải thích chi tiết), nhưng khi tôi nghĩ về tất cả các lỗi tôi phải làm trong những năm qua, câu hỏi là làm thế nào tôi có thể xác định "Này, điều này có thể gây ra một lỗi vô lý, tôi nên sử dụng các hàm chính xác tùy ý ", những ngôn ngữ khác có lỗi này (và những người không có, lý do tại sao). Ngoài ra, tại sao 0.1 + 0.7 thực hiện điều này và tức là 0.1 + 0.3 không, có bất kỳ ví dụ nổi tiếng nào khác không?int ((0.1 + 0.7) * 10) = 7 bằng nhiều ngôn ngữ. Làm thế nào để ngăn chặn điều này?
PHP
//the first one actually doesn't make any sense to me,
//why 7 after typecast if it's represented internally as 8?
debug_zval_dump((0.1+0.7)*10); //double(8) refcount(1)
debug_zval_dump((int)((0.1+0.7)*10)); //long(7) refcount(1)
debug_zval_dump((float)((0.1+0.7)*10)); //double(8) refcount(1)
Python:
>>> ((0.1+0.7)*10)
7.9999999999999991
>>> int((0.1+0.7)*10)
7
Javascript:
alert((0.1+0.7)*10); //7.999999999999999
alert(parseInt((0.7+0.1)*10)); //7
Ruby:
>> ((0.1+0.7)*10).to_i
=> 7
>>((0.1+0.7)*10)
=> 7.999999999999999
nó không phải là một lỗi (và SELECT được không bị hỏng): nhìn lên chính xác và respresentation. được hỏi dưới nhiều hình thức, nhiều lần trên SO –
Đó không phải là "lỗi/tính năng trong một số ngôn ngữ" mà là "lỗi/tính năng trong một số bộ vi xử lý". Đó là giới hạn của độ chính xác gấp đôi – JBernardo
Tôi sẽ không downvote câu hỏi này chỉ vì nó đã được hỏi rất nhiều lần trước đây. Là một đơn vị, đó là một câu hỏi hay. Gắn cờ nó như là một bản sao nếu bạn muốn, Mitch. –