Điều bạn đang gặp phải là một lỗi làm tròn dấu phẩy động cơ bản.
Chúng tôi không thể đại diện chính xác 0,1 mà không có một số lỗi do bản chất của số nhị phân. WolframAlpha reports số thập phân 0.1 đến số nhị phân bằng nhau ~ 0.00011001100110011 ... Lưu ý cách nó không thể được biểu diễn một cách hữu hạn trong hệ thống số nhị phân? Điều này có nghĩa là chúng ta phải quyết định một điểm cắt để dừng tính toán con số này nếu không chúng ta sẽ ở đây mãi mãi.
Điều này giới thiệu lỗi. Và lỗi này đã tích lũy khi mã thêm các số cùng nhau, dẫn đến số lượng cực nhỏ được thêm vào cuối tổng của bạn. Điều này đảm bảo rằng tổng sẽ không bao giờ là chính xác 0,3, đó là những gì các thử nghiệm IF
đang tìm kiếm.
Một số số thập phân, tuy nhiên, có thể được biểu diễn chính xác dưới dạng nhị phân, chẳng hạn như phân đoạn 0.5 = bin 0.1 và dec 0.25 = bin 0.01.
We can demonstrate this tương tự như mã ban đầu của bạn bằng cách sử dụng 0,5 = (0,25 + 0,25).
Để đọc thêm về điều này, tôi khuyên bạn nên The Floating-Point Guide.
Nó cung cấp tổng quan tốt về khái niệm về số dấu phẩy động và cách phát hiện lỗi trong phép tính. Ngoài ra còn có một phần trên Javascript thể hiện cách khắc phục các lỗi làm tròn mà bạn đang gặp phải.
Nguồn
2011-09-30 09:16:27
Xem http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary – mtrw
Và, cụ thể hơn trong JavaScript, http://stackoverflow.com/questions/4088590/0-43-in-javascript-not-1-2-its-1-20000000002-what-happen –
Có lẽ bạn nên làm theo lời khuyên trong phần Câu hỏi thường gặp và tìm kiếm trước khi hỏi một câu hỏi đã được hỏi một lần gazillion trước . – paxdiablo