+5

Nhà tuyển dụng hỏi: "Hãy giải thích vì sao 0.1 + 0.2 == 0.3 là không chính xác "

Hãy giải thích vì sao 0.1 + 0.2 == 0.3 là không chính xác ?

Khi có câu hỏi như vậy, bạn sẽ trả lời như thế nào?

0.3 không phải là kết quả

Javascript

Thực hiện đoạn mã Javascript dưới đây từ một trình duyệt bất kỳ. Kết quả là "0.1+0.2==0.3" cho ra "false".

0.1+0.2==0.3
//false
0.1+0.2===0.3
//false

Nhân tiện, ngay cả khi không thêm số 0 ở đầu như dưới đây, nó vẫn được hiểu là số thập phân.

.1+.2==.3
//false

Python

Tương tự các minh bằng Python phiên bản 3.10.11. "0.1+0.2==0.3" cũng cho ra "false".

>>> 0.1+0.2==0.3
False

Vậy thì tại sao ?

Điều này là do khi 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 không thể được biểu diễn chính xác, dẫn đến sai số. Số 0.1 hay 0.2 trong hệ thập phân trở thành số thập phân vô hạn tuần hoàn trong hệ nhị phân, do đó không thể biểu diễn chính xác các số này. Kết quả là, 0.1 + 0.2 không bằng 0.3.

Cách chuyển đổi số thập phân dưới dạng số sau dấu phẩy thành hệ nhị phân.

Nếu bạn đã học về khoa học máy tính, có lẽ bạn đã biết điều này, nhưng hãy ôn lại.

  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 từ 1 đến 3 cho đến khi phần thập phân trở thành 0 hoặc đạt đến độ chính xác nhất định

Ví dụ với 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ự...)

Cuối cùng, 0.1 trở thành 0.0001100110011001100110011....

Tóm lại

Bản chất của vấn đề này 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à phải hiểu về độ chính xác và cách biểu diễn của các số dấu phẩy động.

(Bổ sung)

Điều này còn phụ thuộc vào đặc tả của ngôn ngữ lập trình! Không phải lúc nào chúng ta cũng có cơ hội quan tâm đến những phần cốt lõi của cách thức triển khai theo đặc tả. Một cách giải quyết trường hợp trên thì nên parse về BigDecimal để tính toán .


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí