0

Phép chia nguyên intdiv() trong PHP: Giải pháp chuẩn xác thay thế toán tử / truyền thống

Chào anh em!

Trong quá trình lập trình Backend, chắc chắn sẽ có lúc bạn gặp các bài toán liên quan đến chia lấy phần nguyên (ví dụ: chia đều số lượng sản phẩm vào các thùng hàng, phân trang dữ liệu, hoặc tính toán tiền tệ).

Trước đây, khi dùng toán tử chia thông thường (/), kết quả trả về luôn ở dạng số thực (float) hoặc bạn phải dùng các hàm làm tròn như floor(), ceil(), hay ép kiểu (int). Điều này không chỉ dài dòng mà đôi khi còn dẫn đến các lỗi sai số dấu phẩy động (floating-point precision) rất tai hại.

May mắn thay, từ phiên bản PHP 7.0, PHP đã chính thức cung cấp một hàm native cực kỳ chuyên dụng mang tên intdiv(). Hãy cùng mổ xẻ xem hàm này có gì hay ho nhé!

1. Bản chất của hàm intdiv()

Nhìn vào định nghĩa nguyên mẫu của hàm trong bộ mã nguồn:

#[Pure]
function intdiv(int $num1, int $num2): int {}

Hàm này nhận vào 2 tham số nguyên:

  • $num1: Số bị chia (Dividend).
  • $num2: Số chia (Divisor).
  • Giá trị trả về: Trả về một số nguyên (int) chính là phần nguyên của phép chia.

Điểm ăn tiền nhất của intdiv(): Nó thực hiện phép chia lấy phần nguyên bằng cách cắt bỏ phần thập phân về hướng số 0 (Truncation toward zero), hoàn toàn khác với việc làm tròn xuống (floor).

Hãy xem ví dụ thực tế so sánh:

// Phép chia thông thường với toán tử /
$result = 5 / 2; // Kết quả: 2.5 (Kiểu float)

// Sử dụng intdiv()
intdiv(5, 2);   // Kết quả: 2 (Kiểu int, lấy phần nguyên)
intdiv(-5, 2);  // Kết quả: -2 (Phần thập phân bị cắt về hướng 0)

2. Các ngoại lệ (Exceptions) cần đặc biệt lưu ý

Không giống như phép chia thông thường trong PHP đời cũ có thể trả về INF hoặc cảnh báo nhẹ khi chia cho 0, hàm intdiv() hoạt động theo cơ chế hiện đại: Bắn ra ngoại lệ (Exceptions) khi gặp các trường hợp toán học bất hợp lý. Anh em cần nắm rõ để bọc try...catch cho chuẩn:

  • DivisionByZeroError: Xảy ra ngay lập tức nếu bạn cố tình truyền số chia $num2 bằng 0.
intdiv(10, 0); // Thổi bay ứng dụng với ngoại lệ DivisionByZeroError!
  • ArithmeticError: Xảy ra trong một trường hợp cực kỳ hy hữu theo toán học máy tính: Khi bạn lấy số nguyên nhỏ nhất có thể biểu diễn trong PHP (PHP_INT_MIN) đem chia cho -1. Lý do là kết quả của phép toán này vượt quá giới hạn lưu trữ của số nguyên 64-bit.
intdiv(PHP_INT_MIN, -1); // Văng ngoại lệ ArithmeticError!

3. Tại sao thuộc tính #[Pure] lại xuất hiện?

Giống như hàm checkdate() mà chúng ta đã tìm hiểu trước đó, intdiv() cũng được gán thuộc tính #[Pure].

Điều này khẳng định đây là một hàm thuần túy: Nó chỉ nhận hai số đầu vào, thực hiện tính toán thuần túy và trả về kết quả mà không hề làm thay đổi bất kỳ trạng thái nào của hệ thống hay ghi file/gọi database. Nhờ vậy, các trình tối ưu hóa mã nguồn tĩnh có thể biên dịch và xử lý cực kỳ nhanh chóng.

Lời kết

intdiv() là một mảnh ghép nhỏ nhưng cực kỳ hữu ích trong bộ công cụ của lập trình viên PHP. Thay vì loay hoay với các phép ép kiểu (int) hay xử lý logic làm tròn thủ công dễ sinh bug, hãy sử dụng intdiv() để thực hiện các bài toán chia lấy phần nguyên một cách sạch sẽ, an toàn và chuẩn xác nhất!


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í