0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Giải Thích Tại Sao 0.1 + 0.2 Không Bằng 0.3: Hiểu Biết Về Số Dấu Phẩy Động

Đăng vào 2 tuần trước

• 2 phút đọc

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 Copy
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 Copy
>>> 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:

  1. Nhân giá trị sau dấu thập phân với 2.
  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.
  3. Chỉ mang phần thập phân sang bước tiếp theo.
  4. 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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào