- vừa được xem lúc

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 "

0 0 13

Người đăng: Nguyễn Ngọc Trung

Theo Viblo Asia

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 .

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 522

- vừa được xem lúc

Type annotation vs Type Inference - Typescript

Trong bài viết này, chúng ta sẽ tìm hiểu kỹ về TypeScript bằng cách tìm hiểu sự khác biệt giữa kiểu chú thích và kiểu suy luận. Tôi sẽ cho rằng bạn có một số kinh nghiệm về JavaScript và biết về các kiểu cơ bản, như chuỗi, số và boolean.

0 0 44

- vừa được xem lúc

Type Annotation và Type Inference trong TypeScript là gì?

Khi làm việc với javascript chắc hẳn các bạn đã quá quen với việc dùng biến mà không cần phải quan tâm đến kiểu dữ liệu của nó là gì phải không? Đúng là mới đầu tiếp cận với Typescript mình cũng cảm thấy nó khá là phiền vì cần phải khai báo đủ type để nó chặt chẽ hơn. Lúc đó mình còn nghĩ: " JavaScr

0 0 37

- vừa được xem lúc

Tìm hiểu TypeScript và kiến thức cơ bản

TypeScript là gì. TypeScript sử dụng tất cả các tính năng của của ECMAScript 2015 (ES6) như classes, modules.

0 0 51

- vừa được xem lúc

TypeScript - P1: Vì sao TypeScript được yêu thích đến vậy?

Trải nghiệm thực tế. Trước khi là một Web Developer, tôi là một Mobile Developer và Java là thứ mà tôi từng theo đuổi.

0 1 67

- vừa được xem lúc

4 Tính năng rất hay từ TypeScript

Xin chào các bạn hôm nay mình xin chia sẽ những tính năng rất hay của TypeScript (TS), các bạn cùng tìm hiểu nhé. Ngoài việc set Type cho biến, tham số hay function thì ví dụ khi bạn nhìn vào một tham

0 0 93