Ngôn ngữ
English English Vietnamese (Tiếng Việt) Vietnamese (Tiếng Việt) Chinese (简体中文) Chinese (简体中文) Portuguese (Brazil) (Português do Brasil) Portuguese (Brazil) (Português do Brasil) Spanish (Español) Spanish (Español) Indonesian (Bahasa Indonesia) Indonesian (Bahasa Indonesia)
Giới thiệu công cụ Máy tính Thực hiện các phép tính nhanh với chế độ tiêu chuẩn và khoa học. Hỗ trợ nhập bàn phím, lịch sử tính toán và hoạt động trên mọi thiết bị. Mở
2026-06-04 03:41:45 6 phút đọc

Lỗi làm tròn nhỏ tích tụ như thế nào trong một phép tính dài

Mỗi phép toán dấu phẩy động đều tạo ra một lỗi làm tròn nhỏ đến mức không thể nhận thấy. Khi chuỗi các phép toán đủ dài, sự sai lệch âm thầm này có thể làm thay đổi kết quả cuối cùng theo cách quan trọng.

Nhập 0.1 + 0.2 vào máy tính ở trên và nhấn bằng. Kết quả hiển thị là 0.3 — vì công cụ làm tròn kết quả ra mười chữ số thập phân trước khi hiển thị. Nhưng phép toán thô bên dưới trả về 0.30000000000000004. Phần nhỏ bé đó không xuất hiện từ hư không; nó là biểu hiện rõ ràng của một hiện tượng sâu hơn: mỗi phép toán dấu phẩy động để lại một phần dư làm tròn, và khi bạn nối đủ nhiều phép toán lại, những phần dư đó có thể tích tụ thành một lỗi quan trọng.

Tại sao máy tính không thể lưu chính xác số 0.1

Máy tính lưu số dưới dạng nhị phân — hệ thống gồm các số một và số không. Cũng như phân số 1/3 không thể viết chính xác trong hệ thập phân (nó trở thành 0.3333… vô tận), số 0.1 không thể viết chính xác trong hệ nhị phân. Giá trị gần nhất mà máy tính có thể lưu trong định dạng double-precision 64-bit được JavaScript sử dụng — và do đó mọi máy tính chạy trên trình duyệt — là khoảng 0.1000000000000000055511151231257827021181583404541015625.

Biểu diễn này tuân theo tiêu chuẩn IEEE 754, định nghĩa cách mọi bộ xử lý hiện đại xử lý số thập phân. Tiêu chuẩn đảm bảo mỗi phép toán trả về kết quả gần nhất có thể biểu diễn — nhưng "gần nhất" không phải là "chính xác." Khoảng cách đó, dù nhỏ đến đâu, theo định nghĩa là lỗi làm tròn.

Cách lỗi tăng lên qua chuỗi phép toán

Một lỗi làm tròn đơn lẻ cỡ 5 × 10⁻¹⁷ là không thể nhận thấy. Vấn đề là điều gì xảy ra khi bạn dùng kết quả hơi sai đó làm đầu vào cho phép toán tiếp theo, và kết quả đó lại làm đầu vào cho phép toán kế tiếp, cứ thế tiếp tục. Như bài viết Wikipedia về lỗi làm tròn mô tả: "Khi một chuỗi phép tính với đầu vào có lỗi làm tròn được thực hiện, lỗi có thể tích tụ, đôi khi chiếm ưu thế trong phép tính."

Có hai cơ chế thúc đẩy sự tăng trưởng này:

  • Dịch cộng dồn — trong phép cộng dài (cộng nhiều giá trị nhỏ), mỗi phép cộng có thể làm tròn theo cùng một hướng. Các lỗi riêng lẻ không triệt tiêu nhau; chúng cộng dồn. Cộng một nghìn số, mỗi số mang lỗi 10⁻¹⁵, có thể tạo ra lỗi cuối cùng khoảng 10⁻¹² — vẫn rất nhỏ về mặt tuyệt đối, nhưng lớn hơn một triệu lần so với lỗi mỗi bước.
  • Hủy bù trừ — trừ hai số gần bằng nhau có thể khuếch đại lỗi tương đối rất mạnh. Nếu cả hai giá trị không chính xác ở chữ số thập phân thứ 15 và 14 chữ số đầu tiên triệt tiêu nhau, lỗi lúc này chiếm ưu thế trên phần còn lại. Máy tính dùng điều này trong các công thức lượng giác và các trường hợp gần hủy bù, đó là lý do các hàm lượng giác được cài đặt rất cẩn thận.

Một ví dụ cụ thể từ việc làm tròn lặp lại

Làm tròn số ở mỗi bước thay vì chỉ làm tròn cuối cùng tạo ra lỗi tổng hợp lớn hơn một lần làm tròn đơn. Làm tròn 9.945309 đến hai chữ số thập phân sẽ được 9.95 (lỗi: 0.0047). Làm tròn tiếp đến một chữ số thập phân sẽ được 10.0 (tổng lỗi: 0.055). Làm tròn một lần duy nhất — 9.945309 đến một chữ số thập phân — cho kết quả 9.9, với tổng lỗi chỉ 0.045. Con đường hai bước tạo thêm lỗi vì lần làm tròn đầu đẩy giá trị vượt qua ngưỡng tiếp theo.

Đó là lý do một phép tính hiển thị kết quả trung gian — ví dụ, sao chép giá trị đã làm tròn từ phép tính này sang phép tính khác — có thể cho kết quả cuối hơi khác so với giữ nguyên độ chính xác trong một biểu thức duy nhất không gián đoạn.

Máy tính xử lý điều này như thế nào

Máy tính ở trên áp dụng bước làm tròn cuối cùng sau khi đánh giá mỗi biểu thức: kết quả dấu phẩy động thô được làm tròn đến mười chữ số thập phân trước khi hiển thị. Mã nội bộ dùng Math.round(result * 1e10) / 1e10, loại bỏ phần dư dấu phẩy động cho hầu hết các phép tính hàng ngày. Đó là lý do 0.1 + 0.2 hiển thị là 0.3 thay vì giá trị thô 0.30000000000000004.

Đây là lựa chọn thực dụng: nó loại bỏ tiếng ồn gây phân tâm ở cuối hầu hết kết quả. Nó cũng có nghĩa máy tính sẽ không hiển thị lỗi nhỏ hơn nhiều so với 10⁻¹⁰, bất kể lỗi đó phát sinh thế nào. Với phần lớn các phép tính thực tế — bài tập, ngân sách, ước tính kỹ thuật — mười chữ số thập phân là độ chính xác vượt mức yêu cầu, nên việc làm tròn này là tính năng, không phải sự thỏa hiệp.

Khi lỗi tích tụ thực sự quan trọng

Với sử dụng hàng ngày, lỗi làm tròn tích tụ hiếm khi là vấn đề. Nó trở nên quan trọng trong các trường hợp sau:

  • Cộng dài rất nhiều số — cộng hàng trăm số tài chính hoặc số đo thủ công, từng bước một, thay vì trong một biểu thức duy nhất.
  • Công thức lặp — phép tính mà đầu ra được dùng làm đầu vào cho nhiều chu kỳ tiếp theo, như lãi kép qua hàng trăm kỳ.
  • Gần hủy bù — trừ hai đại lượng gần như bằng nhau, có thể làm lộ phần dư làm tròn thường ẩn sâu bên phải.
  • Làm tròn trung gian thủ công — sao chép kết quả trung gian đã làm tròn sang bước tiếp theo thay vì giữ nguyên trong cùng biểu thức.

Cách giảm thiểu thực tế rất đơn giản: nhập toàn bộ công thức trong một biểu thức khi có thể, tránh làm tròn giá trị trung gian thủ công, và coi kết quả có nhiều chữ số thập phân là xấp xỉ chứ không phải kết quả chính xác nếu bất kỳ giá trị đầu vào nào cũng là xấp xỉ.

Kiểm tra bản thân: nhập 0.1 + 0.2 vào máy tính ở trên — bạn sẽ thấy 0.3. Màn hình được làm sạch, nhưng phép toán bên dưới không chính xác tuyệt đối. Với chuỗi phép tính dài, hãy giữ biểu thức đầy đủ trên một dòng khi có thể: máy tính sẽ xử lý lỗi làm tròn tích tụ bên trong, thay vì bạn tạo thêm sai lệch bằng cách sao chép các kết quả trung gian đã làm tròn thủ công.
Không tìm thấy? Tự tạo công cụ với AI
Bắt đầu gõ để tìm kiếm...
Đang tìm kiếm...
Không tìm thấy kết quả
Hãy thử tìm với từ khóa khác