Đổi bát phân sang thập phân

Chuyển đổi số hệ bát phân cơ số 8 thành giá trị thập phân thông dụng.

Nếu bạn chạy parseInt("010") trong môi trường JavaScript cũ mà không đặt đối số thứ hai, kết quả trả về có thể là 8 chứ không phải 10. Nguyên nhân xuất phát từ quy ước cũ xem số bắt đầu bằng chữ số 0 là hệ bát phân, tạo nên nhiều sai số trước khi các trình duyệt sửa lại quy chuẩn.

Nguyên lý cơ số 8 của hệ bát phân

Mỗi vị trí trong một số bát phân ứng với một bậc lũy thừa của 8 thay vì 10, và mỗi chữ số chỉ nhận giá trị từ 0 đến 7 — tuyệt đối không xuất hiện chữ số 8 hoặc 9. Lấy ví dụ số bát phân 57: chữ số 5 đứng ở hàng 8 và chữ số 7 đứng ở hàng đơn vị.

Phép tính quy đổi là (5 × 8) + 7 = 47. Lượng này bằng đúng giá trị 2F ở hệ thập lục phân và 101111 ở hệ nhị phân — ba cách biểu diễn khác nhau cho cùng một con số duy nhất.

Các bước chuyển đổi bát phân sang thập phân thủ công

  1. Viết các chữ số của số bát phân kèm chỉ số vị trí, đếm từ phải sang trái bắt đầu từ mốc 0.
  2. Nhân từng chữ số với 8 nâng lên số mũ tương ứng với vị trí đó.
  3. Cộng toàn bộ các kết quả nhân lại với nhau.
  4. Kiểm tra lại để đảm bảo dãy số ban đầu không chứa chữ số 8 hoặc 9 — nếu có, chuỗi đó hoàn toàn không hợp lệ trong hệ bát phân.

Sự cố nhầm lẫn từ tiền tố số 0 khi đổi bát phân

Trong ngôn ngữ lập trình C, một hằng số số học bắt đầu bằng chữ số 0 đơn thuần luôn được hiểu là bát phân — chuỗi 010 trong mã nguồn C mang giá trị bằng 8. JavaScript từng áp dụng cơ chế này suốt một thời gian dài dù không chính thức nằm trong tiêu chuẩn ban đầu.

Lỗi phát sinh trên thực tế khi chuỗi văn bản được chèn thêm số 0 ở đầu để định dạng mã bưu chính hay ngày tháng, rồi được đưa qua bộ phân tích số mà không chỉ định rõ cơ số 10. Chuẩn ECMAScript 5 đã đổi hàm parseInt sang mặc định thập phân, nhưng hiện tượng này vẫn còn tồn tại trong mã nguồn cũ.

Các trường hợp bát phân vẫn được sử dụng có chủ đích

  • Phân quyền tập tin Unix — Các giá trị chmod và umask luôn sử dụng hệ bát phân theo quy ước định sẵn.
  • Mã nguồn C và C++ — Chữ số 0 đứng đầu một số nguyên vẫn được xem là định dạng bát phân theo thiết kế từ những phiên bản đầu tiên.
  • Tiền tố chỉ định rõ ràng — Nhiều ngôn ngữ hiện đại như Python và JavaScript yêu cầu tiền tố 0o riêng biệt để tránh nhầm lẫn cơ số.

Giải đáp thắc mắc về đổi bát phân sang thập phân

Vì sao hệ bát phân chỉ gồm các chữ số từ 0 đến 7?

Bởi vì bát phân là hệ cơ số 8, mỗi chữ số chỉ biểu diễn được 8 trạng thái giá trị riêng biệt. Sự xuất hiện của số 8 hoặc 9 sẽ khiến biểu diễn không còn hợp lệ, tương tự như việc chữ số 2 không thể nằm trong hệ nhị phân.

Hệ bát phân còn phổ biến bên ngoài thiết lập phân quyền Unix không?

Ứng dụng chủ yếu xoay quanh quyền tập tin, bên cạnh sự hiện diện thưa thớt ở một số hệ thống nhúng lâu năm và mã nguồn thuộc họ ngôn ngữ C.

Nguyên nhân cụ thể của lỗi parseInt với số bát phân là gì?

Các bộ phân tích cú pháp JavaScript cũ tự động suy luận chuỗi có số 0 ở đầu là bát phân nếu thiếu tham số radix. Vì thế chuỗi ‘010’ bị chuyển thành 8 thay vì 10.

Giá trị bát phân trong phân quyền chmod khác gì so với số thông thường?

Cách tính toán giá trị số cơ sở giống nhau, nhưng trong chmod các chữ số thường được giải mã thành các cờ phân quyền đọc, ghi, thực thi thay vì chỉ là một số lượng.

JavaScript hiện đại có còn hỗ trợ biểu diễn bát phân không?

Có hỗ trợ nhưng thông qua cú pháp tiền tố tường minh 0o, ví dụ như 0o57. Quy ước ngầm định bằng số 0 đơn lẻ ở đầu đã bị bãi bỏ trong strict mode.

Cookie
Chúng tôi quan tâm đến dữ liệu của bạn và muốn sử dụng cookie để cải thiện trải nghiệm của bạn.