Giải Thích Tại Sao 0.1 + 0.2 Không Bằng 0.3
Nhà tuyển dụng thường đặt ra câu hỏi này để kiểm tra khả năng tư duy và sâu sắc của ứng viên. Vậy bạn sẽ trả lời như thế nào?
Vấn Đề Cơ Bản: 0.3 Không Phải Là Kết Quả Chính Xác
Khi chúng ta thực hiện phép tính trong JavaScript, sẽ thấy rằng:
javascript
0.1 + 0.2 == 0.3; // false
0.1 + 0.2 === 0.3; // false
Ngay cả khi viết thành .1 + .2 == .3
, kết quả cũng vẫn là false
: 0.1 + 0.2 không bằng 0.3.
Tương tự, trong Python phiên bản 3.10.11:
python
>>> 0.1 + 0.2 == 0.3
False
Nguyên Nhân Của Sai Số
Lý do cho hiện tượng này bắt nguồn từ cách mà máy tính biểu diễn số thập phân dưới dạng số dấu phẩy động trong hệ nhị phân. Một số số thập phân, như 0.1 và 0.2, không thể được biểu diễn một cách chính xác và dẫn đến sai số trong quá trình tính toán. Kết quả là, tổng của 0.1 và 0.2 không cho ra 0.3.
Quy Trình Chuyển Đổi Số Thập Phân Thành Nhị Phân
Nếu bạn đã từng học về khoa học máy tính, bạn có thể đã biết cách chuyển đổi số thập phân sang số nhị phân. Dưới đây là quy trình:
- Nhân giá trị sau dấu thập phân với 2.
- Lấy phần nguyên của kết quả và ghi lại nó dưới dạng số nhị phân.
- Chỉ mang phần thập phân sang bước tiếp theo.
- Lặp lại các bước cho đến khi phần thập phân trở thành 0 hoặc đạt đến độ chính xác nào đó.
Ví Dụ Với Số 0.1:
0.1 × 2 = 0.2
(Phần nguyên: 0, Phần thập phân: 0.2)0.2 × 2 = 0.4
(Phần nguyên: 0, Phần thập phân: 0.4)0.4 × 2 = 0.8
(Phần nguyên: 0, Phần thập phân: 0.8)0.8 × 2 = 1.6
(Phần nguyên: 1, Phần thập phân: 0.6)
Tiếp tục tương tự cho đến khi đạt tới độ chính xác yêu cầu.
Cuối cùng, 0.1 trở thành 0.0001100110011001100110011...
Tóm Tắt
Vấn đề cốt lõi nằm ở sai số khi máy tính xử lý các số dấu phẩy động. Điều quan trọng là cần hiểu độ chính xác và cách mà các số này được biểu diễn trong máy tính.
Bổ Sung
Cần lưu ý rằng điều này cũng phụ thuộc vào đặc tả của từng ngôn ngữ lập trình. Đôi khi, bạn sẽ không có cơ hội để chú ý đến những đặc tả đó. Một giải pháp cho vấn đề trên là sử dụng BigDecimal để thực hiện các phép toán chính xác hơn.
source: viblo